我的应用程序崩溃并显示以下错误。
线程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:]
如果你有任何想法来解决这个问题,请帮助我解决它。
答案 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
使用此自定义标签并将您的手势添加到此。