2017-06-16 97 views
0

我想在出现键盘时将我的tableview滚动到底部。但是我收到了很多来自我的用户的崩溃报告。当键盘出现导致崩溃时滚动到底部

我的代码:

func keyboardWillShow(_ notification: Foundation.Notification) { 
    var info = notification.userInfo! 
    let keyboardFrame: CGRect = (info[UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue 

    self.view.layoutIfNeeded() 
    UIView.animate(withDuration: 0.2, animations: { 
     self.bottomCons.constant = keyboardFrame.size.height 

     self.view.layoutIfNeeded() 
    }) 
    let numberOfRows = tableView.numberOfRows(inSection: 0) 
    if numberOfRows != 0 { 
     do { 
      try tableView.scrollToRow(at: IndexPath(row: numberOfRows-1, section: 0), at: .bottom, animated: false) 
     }catch { 
      print("error") 
     } 
    } 

} 

崩溃日志:

Fatal Exception: NSRangeException 
0 CoreFoundation     0x18f3bafe0 __exceptionPreprocess 
1 libobjc.A.dylib    0x18de1c538 objc_exception_throw 
2 CoreFoundation     0x18f299200 -[__NSArrayM removeObjectAtIndex:] 
3 UIKit       0x195826f90 -[UITableView _existingCellForRowAtIndexPath:] 
4 UIKit       0x195836a50 -[UITableView _heightForRowAtIndexPath:] 
5 UIKit       0x1956291c0 -[UISectionRowData heightForRow:inSection:canGuess:] 
6 UIKit       0x195628ebc -[UITableViewRowData rectForRow:inSection:heightCanBeGuessed:] 
7 UIKit       0x19562c21c -[UITableView rectForRowAtIndexPath:] 
8 UIKit       0x195704180 -[UITableView _contentOffsetForScrollingToRowAtIndexPath:atScrollPosition:] 
9 UIKit       0x195703c84 -[UITableView scrollToRowAtIndexPath:atScrollPosition:animated:] 
10 Ribony       0x1000a3044 ChatViewController.keyboardWillShow(Notification) ->() (ChatViewController.swift) 
11 Ribony       0x1000a07d4 @objc ChatViewController.showConnectedLayout(Notification) ->() 
12 CoreFoundation     0x18f3555f4 __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ 
13 CoreFoundation     0x18f354d08 _CFXRegistrationPost 
14 CoreFoundation     0x18f354a84 ___CFXNotificationPost_block_invoke 
15 CoreFoundation     0x18f3c37a8 -[_CFXNotificationRegistrar find:object:observer:enumerator:] 
16 CoreFoundation     0x18f29895c _CFXNotificationPost 
17 Foundation      0x18fdaa930 -[NSNotificationCenter postNotificationName:object:userInfo:] 
18 UIKit       0x195ed0190 -[UIInputWindowController postStartNotifications:withInfo:] 
19 UIKit       0x195ed0edc __48-[UIInputWindowController viewDidLayoutSubviews]_block_invoke 
20 UIKit       0x195ecdc04 -[UIInputWindowController performWithSafeTransitionFrames:] 
21 UIKit       0x195ed098c -[UIInputWindowController viewDidLayoutSubviews] 
22 UIKit       0x1954e90f4 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] 
23 QuartzCore      0x1926d9274 -[CALayer layoutSublayers] 
24 QuartzCore      0x1926cdde8 CA::Layer::layout_if_needed(CA::Transaction*) 
25 UIKit       0x1954fd814 -[UIView(Hierarchy) layoutBelowIfNeeded] 
26 UIKit       0x195ecc4cc -[UIInputSetHostView layoutIfNeeded] 
27 UIKit       0x195c79310 -[_UIRemoteKeyboards controllerDidLayoutSubviews:] 
28 UIKit       0x195d49364 -[UICompatibilityInputViewController viewDidLayoutSubviews] 
29 UIKit       0x1954e90f4 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] 
30 QuartzCore      0x1926d9274 -[CALayer layoutSublayers] 
31 QuartzCore      0x1926cdde8 CA::Layer::layout_if_needed(CA::Transaction*) 
32 UIKit       0x1954fd814 -[UIView(Hierarchy) layoutBelowIfNeeded] 
33 UIKit       0x195ecc4cc -[UIInputSetHostView layoutIfNeeded] 
34 UIKit       0x195ed4da0 -[UIInputWindowController _updateBackdropViews] 
35 UIKit       0x195d4823c -[UICompatibilityInputViewController setInputMode:] 
36 CoreFoundation     0x18f3555f4 __CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ 
37 CoreFoundation     0x18f354d08 _CFXRegistrationPost 
38 CoreFoundation     0x18f354a84 ___CFXNotificationPost_block_invoke 
39 CoreFoundation     0x18f3c37a8 -[_CFXNotificationRegistrar find:object:observer:enumerator:] 
40 CoreFoundation     0x18f29895c _CFXNotificationPost 
41 Foundation      0x18fdaa930 -[NSNotificationCenter postNotificationName:object:userInfo:] 
42 UIKit       0x195908be4 -[UIKeyboardImpl setKeyboardInputMode:userInitiated:updateIndicator:executionContext:] 
43 UIKit       0x19590a388 -[UIKeyboardImpl setInputModeToNextInPreferredListWithExecutionContext:] 
44 UIKit       0x1956aed88 -[UIKeyboardLayoutStar completeSendStringActionForTouchUp:withActions:timestamp:interval:didLongPress:prevActions:executionContext:] 
45 UIKit       0x1956a1f18 -[UIKeyboardLayoutStar completeRetestForTouchUp:timestamp:interval:executionContext:] 
46 UIKit       0x19592bbb8 __45-[UIKeyboardLayout touchUpTaskForTouchState:]_block_invoke 
47 UIKit       0x195515e0c -[UIKeyboardTaskQueue continueExecutionOnMainThread] 
48 UIKit       0x19592b868 -[UIKeyboardLayout _touchEndedProcessingForTouches:] 
49 UIKit       0x195520390 -[UIWindow _sendTouchesForEvent:] 
50 UIKit       0x19551b728 -[UIWindow sendEvent:] 
51 UIKit       0x1954ec33c -[UIApplication sendEvent:] 
52 UIKit       0x195ce6014 __dispatchPreprocessedEventFromEventQueue 
53 UIKit       0x195ce0770 __handleEventQueue 
54 UIKit       0x195ce0b9c __handleHIDEventFetcherDrain 
55 CoreFoundation     0x18f36942c __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ 
56 CoreFoundation     0x18f368d9c __CFRunLoopDoSources0 
57 CoreFoundation     0x18f3669a8 __CFRunLoopRun 
58 CoreFoundation     0x18f296da4 CFRunLoopRunSpecific 
59 GraphicsServices    0x190d00074 GSEventRunModal 
60 UIKit       0x195551058 UIApplicationMain 
61 Ribony       0x10003f11c main (AppDelegate.swift:15) 
62 libdyld.dylib     0x18e2a559c start 

我怎样才能解决这个问题?

+0

什么'IndexPath(row:numberOfRows-1,section:0)'实际上是什么意思? – nayem

回答

0

我相信问题奠定了这里

UIView.animate(withDuration: 0.2, animations: { 
    self.bottomCons.constant = keyboardFrame.size.height 

    self.view.layoutIfNeeded() 
}) 

... 

try tableView.scrollToRow(at: IndexPath(row: numberOfRows-1, section: 0), at: .bottom, animated: false) 

重新装入布局,并试图在非常同一时刻滚动,你应该事后或之前滚动。可能是我不对,但这通常是问题。

+0

嗯你有什么建议来解决这个问题? –

+0

使用其完成块,如果需要,请在此处查看文档https://developer.apple.com/documentation/uikit/uiview/1622515-animatewithduration – Luzo

相关问题