我有一个从网络服务器中随机抽取问卷的表格。我需要一个按钮执行(setNeedsDisplay)刷新页面...当我点击错误按钮时,应用程序崩溃了:
*由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [ExercisesViewController setNeedsDisplay]:无法识别的选择器发送到实例0x6a1e840' ***第一次抛出调用堆栈: (0x13f3022 0x1584cd6 0x13f4cbd 0x1359ed0 0x1359cb2 0x963054 0x974fc6 0x57c0 0x13f4e99 0x4014e 0x400e6 0xe6ade 0xe6fa7 0xe6266 0x301a1a 0x13c799e 0x135e640 0x132a4c6 0x1329d84 0x1329c9b 0x12dc7d8 0x12dc88a 0x3d626 0x1f96 0x1f05) 终止调用抛出异常*
//Add refreshing agenda
scrollViewFrame = CGRectMake(0, 200, 80, 40);
mark = [UIButton buttonWithType:UIButtonTypeRoundedRect];
mark.frame = scrollViewFrame;
[mark setTitle:@"Get Score" forState:UIControlStateNormal];
[mark setBackgroundColor:[UIColor clearColor]];
[mark addTarget:self
action:@selector(markButtonSelected:) forControlEvents:UIControlEventTouchUpInside];
[scrollView addSubview:mark];
...
- (IBAction)markButtonSelected:(id)sender{
[self performSelectorInBackground:@selector(setNeedsDisplay) withObject:nil];
}
这是语法问题吗?我读到here它与线程有关。有人可以解释线程或有更直接的方法吗? Thanx提前...
答案 0 :(得分:4)
setNeedsDisplay
方法是UIView
方法,而不是UIViewController
。在markButtonSelected:
方法中,只需添加:[self.view setNeedsDisplay];
答案 1 :(得分:0)
使用:
[self.view setNeedsDisplay];
答案 2 :(得分:0)
应该在主线程上查看更新。
使用
[self.view performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:YES];
答案 3 :(得分:0)
您需要在UIView上调用setNeedsDisplay,而不是UIViewController。异步执行此操作会产生更好的性能。使用GCD进行异步工作是Apple的首选方式。
即:
dispatch_async(dispatch_get_main_queue(), ^{
[self.view setNeedsDisplay];
});