2012-04-26 135 views
2

我有一个从Web服务器拉出的随机调查表。我需要有一个按钮执行(setNeedsDisplay)刷新......当我与错误点击了按钮的应用程序崩溃的页面:刷新视图controller.m

*终止应用程序由于未捕获的异常“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

用途:

[self.view setNeedsDisplay]; 
+2

你不应该做与UIViews东西在后台线程 – 2012-04-26 13:12:50

+0

如此。好点子。我专注于在视图与控制器上调用setNeedsDisplay。 – mprivat 2012-04-26 13:17:22

4

setNeedsDisplay方法是UIView的方法,而不是UIViewController。在您的markButtonSelected:方法中只需添加:[self.view setNeedsDisplay];

+0

好消息是,它不会崩溃,但视图不刷新。 – 2012-04-26 13:42:38

+2

什么是setNeedsDisplay方法所做的是在下一个事件生命周期中将此视图标记为重绘,这会导致调用UIView的drawRect:方法,重绘视图并将其图层缓存到GPU中。因此,如果您调用setNeedsDisplay的视图不是具有已实现的drawRect:方法的子视图,则setNeedsDisplay不适合您的需求,您需要另一种方法来完成您的任务。不幸的是,如果你不显示更多的代码,我们不能帮助你。 – graver 2012-04-26 13:52:21

0

视图更新应该在主线程上完成。

使用

[self.view performSelectorOnMainThread:@selector(setNeedsDisplay) withObject:nil waitUntilDone:YES]; 
+0

setNeedsDisplay只更新脏标志,以便在下一次绘制时呈现视图,您不需要waitUntilDone:YES。 – 2012-04-26 13:37:36

+0

仍然不刷新:( – 2012-04-26 13:45:22

+0

@matt:约定... – 2012-04-26 13:57:59

0

您需要调用UIView的,而不是UIViewController的setNeedsDisplay。这样做异步产生更好的性能。使用GCD进行异步工作是Apple首选的方式。

即:

dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.view setNeedsDisplay]; 
    }); 
+0

我的调查问卷是在视图控制器本身不UIView。我如何实现呢?在IBAction? – 2012-04-26 14:47:50

+0

在您的错误消息,接收器是一个UIViewController - 多数民众赞成在你错误在哪里,UIViewController有一个叫'view'的成员,你可以访问它。 – 2012-04-26 14:56:27