2012-04-26 167 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