2012-01-23 49 views
4

我有麻煩setNeedsDisplay。我有一個UIView,有很多子UIViews,在Inteface Builder中創建。我也有一個帶有IBAction的按鈕。在這個IBAction我想重新繪製/重新加載所有UIViews(或所有UIElements,如UILabel,UIWebView等..)重新加載/刷新子視圖 - setNeedsDisplay does not工作

我這樣做,這不適合我,不知道爲什麼..:

//redraw the UIViews 
[self.view_card_0 setNeedsDisplay]; 
[self.view_card_1 setNeedsDisplay]; 
[self.view_card_stapel setNeedsDisplay]; 

//other UI Elements 
[self.webView_0 setNeedsDisplay]; 
[self.webView_1 setNeedsDisplay]; 
[self.webView_stapel setNeedsDisplay]; 

[self.lblCardTitle_0 setNeedsDisplay]; 
[self.lblCardTitle_1 setNeedsDisplay]; 
[self.lblCardTitle_stapel setNeedsDisplay]; 

[self.img_card_0 setNeedsDisplay]; 
[self.img_card_1 setNeedsDisplay]; 
[self.img_card_stapel setNeedsDisplay]; 

如何重繪/重載/刷新所有UIElements/UIViews和Subviews?

編輯1:

我如何加載視圖:

detailViewController = [[DetailViewController alloc] 
initWithNibName:@"DetailViewController_iPad" bundle:[NSBundle mainBundle]]; 

的detailviewcontroller已經沒有視圖控制器,只是uiviews,這裏的hierarchie:

  • 的UIView
    - UIViewContainer
    --- UIView0
    --- UIView1
    --- UIViewStapel

我所期望的事情:

* 我不想要重置的UIView,我想改變背景和他們的內容。 *

我在我的detailview中有很多子視圖(uiviews),見上面hierarchie。我在UIViews中顯示內容,內容來自coreData。
view1包含coreData的當前行。
view0包含coreData的前一行。
viewStapel包含coreData的下一行。

隨着IBAction爲我想迭代coreData行,如果操作called..and所以在當前顯示的下一行..

在日誌中,數據被改變,但在UIViews不顯示。原因是我需要重繪或重新加載或類似的東西,以顯示當前的數據。

編輯2:解決
我已經把代碼放在一個新的方法和調用此方法已解決了我的問題。

+0

你爲什麼要這麼做?你期待它做什麼?通常,在其他某個UI元素上調用'-setNeedsDisplay'不會執行任何操作*,因爲如果UI元素需要更新其顯示(以響應更改的屬性),它將自己調用該方法。 –

+0

我正在改變IBAction的內容以及顏色/圖像。內容來自coreData。我需要重繪uiviews才能在ibaction上顯示更改。 – brush51

+1

setNeedsDisplay只是重繪視圖,它不重置它的屬性(例如顏色)。要做到這一點,你必須從nib文件重新加載它們(見下面的答案)。 –

回答

17

您是否試圖將視圖和子視圖重置爲其在nib文件中的默認狀態?

如果是這樣,上述方法將無法正常工作。自動執行此操作的唯一方法是從筆尖重新加載視圖,但在我能提供幫助之前,您需要更清楚地瞭解如何在第一時間加載視圖。

如果您將它加載到視圖控制器中,那麼刷新它的最簡單方法是從屏幕中刪除視圖控制器並重新創建它,但是您可能可以重新加載視圖,說出類似這樣的內容(從內部控制器):

UIView *parent = self.view.superview; 
[self.view removeFromSuperview]; 
self.view = nil; // unloads the view 
[parent addSubview:self.view]; //reloads the view from the nib 

如果您是直接從筆尖使用[一個NSBundle mainBundle] loadNibNamed ...]或同等加載的觀點,重新加載視圖,則最好的辦法就是把它扔掉和呼叫該方法再次。

+0

謝謝你的迴應。看我的Edit1。已經解釋了一下。 – brush51

+0

看起來你正在用視圖控制器做一些奇怪的事情,可能不會像你認爲的那樣工作。你說你沒有視圖控制器,但是如果不是視圖控制器,DetailViewController是什麼?我知道nib文件中沒有視圖控制器,因爲這不是nibs的工作方式,但是您仍然在創建視圖控制器並從nib中填充它的視圖層次結構。 –

+0

我已經把代碼放在一個新的方法中,調用這個方法已經解決了我的問題。謝謝! – brush51

1

這可能有助於某人在容器視圖內進行分頁。上面的代碼給了我想法試試這個,它的工作原理。

[self.pageViewController.view removeFromSuperview]; 
self.pageViewController.view = nil; // unloads the view 
[self performSegueWithIdentifier:@"pageViewSegue" sender:self]; 
6

斯威夫特2

這是尼克·洛克伍德的回答一些簡單的副本的副本粘貼

let parent = self.view.superview 
self.view.removeFromSuperview() 
self.view = nil 
parent?.addSubview(self.view)