2016-02-05 119 views
5

下面是我的一個應用程序中發生崩潰的堆棧跟蹤。我不知道如何解決它,它並不總是發生?請幫助:)Swift「Specialized」Crash

它是否與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 

與此相伴,這是cellForRow功能,我有

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 
    } 
} 
+0

您的表視圖中有多少部分? – Shripada

+0

@Shripada對不起3節 – Phil

+0

好吧,現在很清楚它爲什麼會崩潰。注意到,您沒有爲indexPath.section == 2的情況加載用戶對象。處理該問題。 – Shripada

回答

1

您需要創建用戶對象爲在indexPath.section == 2,你有3個部分的情況下。您將需要確保「用戶」對象是該代碼塊正確初始化(指內註釋代碼)

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. 
     } 
    } 
+0

我只是覺得奇怪這是怎麼發生的不一致。 1.專業意思是什麼 – Phil

+0

2.爲什麼我不能在堆棧跟蹤中找到「索引越界」? @shripada – Phil

+0

這不是索引超出界限的問題。誠然,那個崩潰日誌可能會更有幫助,說你正在訪問一個未初始化的隱式解包var。 – Shripada

0

我有這樣的「專業」的錯誤也。崩潰只發生在iOS 8.0和8.1上。這是我的堆棧跟蹤的一部分。

Crashed: com.apple.main-thread 
0 Viki       0x10027bb28 specialized LoginFlowSocialButton.traitCollectionDidChange(UITraitCollection?) ->() + 4297243432 
1 Viki       0x10027ad30 @objc LoginFlowSocialButton.traitCollectionDidChange(UITraitCollection?) ->() (LoginFlowButton.swift) 
2 UIKit       0x18a696cd4 -[UIView _processTraitsDidChangeRecursively:forceNotification:] + 124 
3 UIKit       0x18a3d05f4 __45-[UIView(Hierarchy) _postMovedFromSuperview:]_block_invoke + 348 
4 UIKit       0x18a3d0408 -[UIView(Hierarchy) _postMovedFromSuperview:] + 484 
5 UIKit       0x18a3dbea4 -[UIView(Internal) _addSubview:positioned:relativeTo:] + 1724 
6 UIKit       0x18a694f34 -[UIView initWithCoder:] + 756 
... 

我嘗試下載這些版本的iOS模擬器之一併再次測試。原來的崩潰是使用強制解包var,但在traitCollectionDidChange函數中發現nil

所以這裏的教訓只是錯誤消息中的specialized函數可能並不指向確切的問題。您可以嘗試更多地瞭解該功能,並查看哪裏出了問題。

希望有所幫助。 :)