IOS App与[UITableView reloadData]崩溃

时间:2014-08-05 05:58:02

标签: ios uitableview reloaddata

我的应用程序崩溃并显示以下错误。

线程0崩溃:

0   libobjc.A.dylib                 0x3b5d7b26 objc_msgSend + 6

1   UIKit                           0x339c74f4 -[UIResponder(Static) _setFirstResponder:] + 40

2   UIKit                           0x339c74f4 -[UIResponder(Static) _setFirstResponder:] + 40

3   UIKit                           0x339b3000 -[UIResponder resignFirstResponder] + 248

4   UIKit                           0x339e4e9c -[UITableView reloadData] + 224

5   CSModule                        0x001588e2 -[UIBubbleTableView reloadData] 

我尝试修复问题,但没有得到解决方案。请帮我解决这个问题。

我已经创建了一个带有标签的自定义视图到表格单元格视图,当我们点击该自定义视图时,它会显示带有复制选项的UIMenuController。我的自定义视图处理点击手势如下

-(void) handleTapGesture:(UIGestureRecognizer*) recognizer{

    if (self.window == nil) {
        NSLog(@" \n\n\n\n Window is null \n\n\n\n\n\n");
        return;
    }

    [self becomeFirstResponder];

    CGRect targetRectangle = CGRectMake(self.bounds.size.width/2, 2, 2, 2);

    UIMenuController *menuController = [UIMenuController sharedMenuController];
    [menuController setTargetRect:targetRectangle inView:self];
    [menuController setMenuVisible:YES animated:YES];
} 

如果我没有处理点击手势并且没有显示这个UIMenuController,那么它不会产生任何崩溃。

崩溃是随机发生的,我在UITableView中实现了Pull to refresh,在拉动时我从服务器下载以前的数据并重新加载tableview,同时我点击单元格中的自定义视图,发生一些时间崩溃。

还有一些时间崩溃发生在handleTapGesture函数中,如下所述。

线程0崩溃:

0 libobjc.A.dylib 0x3b5d7b26 objc_msgSend + 6

1 UIKit 0x339c74f4 - [UIResponder(Static)_setFirstResponder:] + 40

2 UIKit 0x339c74f4 - [UIResponder(静态)_setFirstResponder:] + 40

3 UIKit 0x339c74f4 - [UIResponder(Static)_setFirstResponder:] + 40

4 UIKit 0x339b2f92 - [UIResponder resignFirstResponder] + 138

5 UIKit 0x3398d958 - [UIResponder becomeFirstResponder] + 308

6 UIKit 0x3398dc46 - [UIView(Hierarchy)becomeFirstResponder] + 102

7 CSModule 0x0006ceb2 - [UIChatFootageTextView handleTapGesture:]

如果你有任何想法来解决这个问题,请帮助我解决它。

3 个答案:

答案 0 :(得分:2)

FWIW,我在ios8 GM上的应用程序中注意到了同样的问题。问题似乎是如果你在没有要显示的记录的UITableView上调用reloadData(I.E新安装的应用程序)它会崩溃。

在调用方法之前,我必须开始检查以确保我尝试显示的记录数是> 0。我个人认为这是ios8中的一个错误。如果我要求视图重新加载数据,并且没有数据,它应该处理它。在询问视图重新加载之前,我不应该评估数据存在。有点打破整个MVC设计模式IMO。

祝你们好运。

答案 1 :(得分:1)

以前,我遇到了崩溃问题。根据我的想法,因为我将自定义视图设置为显示UIMenuController的第一响应者,这是可见的UIMenuController所必需的。所以我无法删除该声明。

为了解决这个问题,我在UIMenuController设置为可见之后将其作为第一响应者辞职。现在我的应用程序没有得到随机崩溃。

-(void) handleTapGesture:(UIGestureRecognizer*) recognizer{

    if (self.window == nil) {
        NSLog(@" \n\n\n\n Window is null \n\n\n\n\n\n");
        return;
    }

    [self becomeFirstResponder];

    CGRect targetRectangle = CGRectMake(self.bounds.size.width/2, 2, 2, 2);

    UIMenuController *menuController = [UIMenuController sharedMenuController];
    [menuController setTargetRect:targetRectangle inView:self];
    [menuController setMenuVisible:YES animated:YES];

    [self resignFirstResponder];
}

答案 2 :(得分:0)

UILabel不允许becomeFirstResponder。您必须继承UILabel才能实现此目的。

@interface CustomLabel : UILabel
@end

@implementation CustomLabel

- (BOOL)canBecomeFirstResponder {
    return YES;
}

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
    return (action == @selector(copy:));
}

- (void)copy:(id)sender {
    [[UIPasteboard generalPasteboard] setString:self.text];
}

@end

使用此自定义标签并将您的手势添加到此。