2016-01-18 2 views
2

Я получаю отчет о сбоях от Crashlytics, который всегда находится в одном и том же месте, но я не могу реплицировать сбой.Сообщение об аварии на UITableview reloadData

Кажется, что только пользователи iOS 9 и только очень редко. Я не уверен, что это проблема с кодом или что-то еще. В последней строке упоминается libdispatch.dylib как отсутствующий, опять же, не уверен, если уместно.

Crashlytics указывает, что авария происходит на MMDetailTableVC.m линия 1407, которая является линией reloadData.

Вот что сообщается:

Crashed: com.apple.main-thread 
EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x0000000000000001 

Thread : Crashed: com.apple.main-thread 
0 libobjc.A.dylib   0x20f0fae2 objc_msgSend + 1 
1 CoreFoundation   0x2168b91b -[NSDictionary descriptionWithLocale:indent:] + 310 
2 Foundation    0x21e77e2d _NSDescriptionWithLocaleFunc + 60 
3 CoreFoundation   0x217091a3 __CFStringAppendFormatCore + 7986 
4 CoreFoundation   0x21707255 _CFStringCreateWithFormatAndArgumentsAux2 + 80 
5 CoreFoundation   0x2171f559 _CFLogvEx2 + 96 
6 CoreFoundation   0x2171f9af _CFLogvEx3 + 118 
7 Foundation    0x21f3f4f7 _NSLogv + 126 
8 Foundation    0x21e8679d NSLog + 28 
9 UIKit      0x259b45fb -[UITableView reloadData] + 1818 
10 Simple Meeting Minutes 0x91fff -[MMDetailTableVC saveItemEntry:] (MMDetailTableVC.m:1407) 
11 Simple Meeting Minutes 0xa2edf -[MMItemViewController saveButtonAction:] (MMItemViewController.m:526) 
12 UIKit      0x25905771 -[UIApplication sendAction:to:from:forEvent:] + 80 
13 UIKit      0x25a86c71 -[UIBarButtonItem(UIInternal) _sendAction:withEvent:] + 140 
14 UIKit      0x25905771 -[UIApplication sendAction:to:from:forEvent:] + 80 
15 UIKit      0x25905701 -[UIControl sendAction:to:forEvent:] + 64 
16 UIKit      0x258ed61f -[UIControl _sendActionsForEvents:withEvent:] + 446 
17 UIKit      0x258ed74b -[UIControl _sendActionsForEvents:withEvent:] + 746 
18 UIKit      0x25905051 -[UIControl touchesEnded:withEvent:] + 616 
19 UIKit      0x25904cbf -[UIWindow _sendTouchesForEvent:] + 646 
20 UIKit      0x258fd5d7 -[UIWindow sendEvent:] + 642 
21 UIKit      0x258ce119 -[UIApplication sendEvent:] + 204 
22 UIKit      0x258cc757 _UIApplicationHandleEventQueue + 5134 
23 CoreFoundation   0x216f9257 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 14 
24 CoreFoundation   0x216f8e47 __CFRunLoopDoSources0 + 454 
25 CoreFoundation   0x216f71af __CFRunLoopRun + 806 
26 CoreFoundation   0x21649bb9 CFRunLoopRunSpecific + 516 
27 CoreFoundation   0x216499ad CFRunLoopRunInMode + 108 
28 GraphicsServices   0x228c3af9 GSEventRunModal + 160 
29 UIKit      0x25935fb5 UIApplicationMain + 144 
30 Simple Meeting Minutes 0x8c59f main (main.m:16) 
31 libdispatch.dylib   0x212fc873 (Missing) 

И вот мой код saveItemEntry, который всегда кажется, что место, где происходит сбой.

- (void)saveItemEntry:(MMitem *)item{ 

    if (item) 
    { 
     NSString *resultStr = [self.meetingModel saveItem:item]; 

     if ([resultStr isEqualToString:@"OK"]) 
     { 
      // all good so close form and refresh data 
      [_itemViewController dismissViewControllerAnimated:NO completion:nil]; 

      [self.tableView reloadData]; 

      // or if there is an error result then display message 
     } 
     else if ([resultStr isEqualToString:@"DescriptionNotesMissing"]) 
     { 
      [self showAlert:@"Missing Description or Notes" :@"An Item Description or Notes is required" :0]; 
      [self.itemViewController.itemDescription becomeFirstResponder]; 
     } 
     // for any other error do nothing 
    } 
} 

ответ

0

Hooray - наконец-то нашел причину этой неуловимой проблемы. Сбой произошел из-за того, что пользователь находился в режиме редактирования в пределах UITextfield в ячейке таблицы, когда вызывался reloadData (в результате чего пользователь нажал в другом месте или повернул iPad, который также назывался ReloadData).

Я исправил проблему, прервав любой [self.tableView ReloadData] с помощью [self.view endEditing:YES], чтобы убедиться, что клавиатура была уволена, а ячейки не были в режиме редактирования.

Имеет смысл, но какая неприятная ловушка.

1

Мы не знаем, вызываете ли вы этот метод в основном потоке или нет.

А также табличное представление занимает время при перезагрузке его ячейки. Так было бы здорово, если вы можете добавить эти коды в dispatch_get_main_queue

dispatch_async(dispatch_get_main_queue(), ^(void){ 
    [_itemViewController dismissViewControllerAnimated:NO completion:nil]; 
    [self.tableView reloadData]; 
} 

и

dispatch_async(dispatch_get_main_queue(), ^(void){ 
    [self showAlert:@"Missing Description or Notes" :@"An Item Description or Notes is required" :0]; 
    [self.itemViewController.itemDescription becomeFirstResponder]; 
} 

Это будет очень безопасно, если мы работаем на обновление пользовательского интерфейса из любого уведомления или делегации с dispatch_async(dispatch_get_main_queue(), ^(void){

+0

Спасибо Ankit, я вызываю метод как метод делегата из второго контроллера представления, MMItemViewController. Первый VC представляет собой таблицу VC, содержащую список элементов, второй VC используется для редактирования элемента. Пользователь выбирает отмену или сохранение для вызова соответствующего метода в первом элементе управления.
Я также заметил, что я использую [_itemViewController rejectViewControllerAnimated: No completion: nil], а в другом месте я использую [self rejectViewControllerAnimated: No completion: nil]. Оба работают нормально, но второй метод, я считаю, более корректен. Считаете ли вы, что это может иметь значение? – Paul

+0

При использовании предлагаемого кода он хочет видеть закрывающий кронштейн. Я добавил следующее: dispatch_async (dispatch_get_main_queue(),^(void) { [_itemViewController offViewControllerAnimated: NO завершение: nil]; [self.tableView reloadData]; }); 'это правильно? Можете ли вы немного объяснить, что делает ваш код? спасибо – Paul

+0

Я поделился непроверенным кодом, возможно, скобки отсутствуют. –