Search code examples
iosswiftgenericscrash

Swift "Specialized" Crash


Below is the stacktrace of a crash that keeps occurring in one of my apps. I have no clue how to fix it and it doesn't always happen? PLEASE HELP :)

Does it have something to do with Swift Generics?

    Thread : Crashed: com.apple.main-thread
0  MyApp                         0x1000f4f5c specialized FriendsTableViewController.tableView(UITableView, cellForRowAtIndexPath : NSIndexPath) -> UITableViewCell (FriendsTableViewController.swift)
1  MyApp                         0x1000f1f60 @objc FriendsTableViewController.tableView(UITableView, cellForRowAtIndexPath : NSIndexPath) -> UITableViewCell (FriendsTableViewController.swift)
2  UIKit                          0x1867ad31c -[UITableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:] + 692
3  UIKit                          0x1867ad484 -[UITableView _createPreparedCellForGlobalRow:willDisplay:] + 80
4  UIKit                          0x18679c9b8 -[UITableView _updateVisibleCellsNow:isRecursive:] + 2824
5  UIKit                          0x186539208 -[UITableView _setNeedsVisibleCellsUpdate:withFrames:] + 240
6  UIKit                          0x1865390d0 -[UITableView _rectChangedWithNewSize:oldSize:] + 996
7  UIKit                          0x186546df4 -[UITableView setBounds:] + 256
8  UIKit                          0x18647a2bc -[UIScrollView setContentOffset:] + 424
9  UIKit                          0x1865382bc -[UITableView setContentOffset:] + 300
10 UIKit                          0x186780a3c -[UIScrollView(UIScrollViewInternal) _adjustContentOffsetIfNecessary] + 60
11 UIKit                          0x18677ab5c -[UIScrollView _updateForChangedScrollRelatedInsets] + 48
12 UIKit                          0x18651d5ac -[UIScrollView setContentInset:] + 116
13 UIKit                          0x186546c50 -[UITableView setContentInset:] + 132
14 UIKit                          0x1865bf250 -[UIScrollView(UIScrollViewInternal) _adjustForAutomaticKeyboardInfo:animated:lastAdjustment:] + 348
15 UIKit                          0x1865bf0b8 -[UITableView _adjustForAutomaticKeyboardInfo:animated:lastAdjustment:] + 108
16 UIKit                          0x186d50380 -[UIAutoRespondingScrollViewControllerKeyboardSupport _adjustScrollViewForKeyboardInfo:] + 288
17 Foundation                     0x18211e44c __NSFireDelayedPerform + 428
18 CoreFoundation                 0x1817215f4 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 28
19 CoreFoundation                 0x181721298 __CFRunLoopDoTimer + 884
20 CoreFoundation                 0x18171e9ac __CFRunLoopRun + 1520
21 CoreFoundation                 0x18164d680 CFRunLoopRunSpecific + 384
22 GraphicsServices               0x182b5c088 GSEventRunModal + 180
23 UIKit                          0x1864c4d90 UIApplicationMain + 204
24 MyApp                         0x100094ef8 main (AppDelegate.swift:15)
25 libdispatch.dylib              0x1811ee8b8 (Missing

Along with this, this is the cellForRow function that I have

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    if indexPath.section < 2 {
        let cell = tableView.dequeueReusableCellWithIdentifier("FriendCell", forIndexPath: indexPath) as! FriendTableViewCell
        cell.tag = indexPath.row

        var user: TetherUser!

        if searching {
            user = searchedUsers[indexPath.row]
        } else {
            if indexPath.section == 0 {
                user = users[indexPath.row]
                cell.actionButton.friendIsContact = false
            } else if indexPath.section == 1 {
                user = contactsWithApp[indexPath.row]
                cell.actionButton.friendIsContact = true
            }
        }

        user.tag = indexPath.row

        cell.nameLabel.text = user.fullName
        cell.profileImageView.image = nil
        user.profileImage { (image) -> Void in
            if user.tag == cell.tag {
                cell.profileImageView.image = image
            }
        }

        if let currentUserID = TetherManager.sharedInstance.currentTetherUser?.objectId {
            cell.actionButton.type = user.relationToUserWithID(currentUserID)
            cell.actionButton.tag = indexPath.row
            cell.actionButton.delegate = self
            switch user.relationToUserWithID(currentUserID) {
            case .None:
                cell.actionButton.button.setImage(UIImage(named: "AddFriend"), forState: .Normal)
                break
            case .SentFriendRequest:
                cell.actionButton.button.setImage(UIImage(named: "ReceivedFriendRequest"), forState: .Normal)
                break
            case .ReceivedFriendRequest:
                cell.actionButton.button.setImage(UIImage(named: "PendingFriendRequest"), forState: .Normal)
                break
            case .Friends:
                cell.actionButton.button.setImage(UIImage(named: "RemoveFriend"), forState: .Normal)
                break
            }
        }
        return cell
    } else {
        //Contacts
        let cell = tableView.dequeueReusableCellWithIdentifier("ContactCell", forIndexPath: indexPath) as! ContactTableViewCell
        cell.contact = addressBookContacts[indexPath.row]
        cell.delegate = self
        return cell
    }
}

Solution

  • You will need to create the User object for the case for when indexPath.section == 2 as you have 3 sections. You will need to ensure the 'user' object is properly initialised in this code block (refer to inline comment in the code)

        var user: TetherUser!
    
        if searching {
            user = searchedUsers[indexPath.row]
        } else {
            if indexPath.section == 0 {
                user = users[indexPath.row]
                cell.actionButton.friendIsContact = false
            } else if indexPath.section == 1 {
                user = contactsWithApp[indexPath.row]
                cell.actionButton.friendIsContact = true
            } else if indexPath.section == 2 {
             // Add code here to ensure user has proper value.
            }
        }