2012-01-23 28 views
4

setNeedsDisplayに問題があります。私は、Inteface Builderで作成された多くのサブUIViewを持つUIViewを持っています。 IBActionのボタンもあります。このIBActionでは、すべてのUIView(またはUILabel、UIWebViewなどのすべてのUIElements)を再描画または再ロードしたいと考えています。サブビューをリロード/リフレッシュ - setNeedsDisplay does not work

私はこれを行っていますが、私にとってはうまくいかず、理由はわかりません:

//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とSubviewを再描画/再読み込み/更新するにはどうすればよいですか?

EDIT 1:

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

がdetailviewcontrollerは何のViewControllerは、ちょうどここhierarchie、uiviewsていない:私はビューをロードする方法

  • のUIView
    - UIViewContainer
    私は何を期待するどのよう--- UIView0
    --- UIView1
    --- UIViewStapel

* 私は私が変更したい、のUIViewをリセットしたくありません背景とそれらの内容。 *

私は詳細ビューに多くのサブビュー(uiviews)があります。上記の階層を参照してください。私は、UIViewsのコンテンツを表示しています、コンテンツはcoreDataから来ています。
view1には、coreDataの現在の行が含まれています。
view0には、coreDataの前の行が含まれています。
viewStapelには、coreDataの次の行が含まれます。私はcoreData行を反復処理したいIBActionで

、アクションがログに..

ようにcalled..andされている場合、現在の次の行を表示し、データを変更しましたが、UIViewsには表示されません。 。これの原因は、現在のデータを表示するために、このような再描画や再ロードなどが必要です。

EDIT 2:私は、新しい方法でコードを入れて、私の問題を解決した、このメソッドを呼び出している
を解決しました。

+0

なぜあなたはこれをやっているを貼り付けているのですか?それは何を期待していますか? UI要素が(プロパティの変更に応答して)その表示を更新する必要がある場合、そのメソッド自体が既に呼び出されているため、他のUI要素で '-setNeedsDisplay'を呼び出すのは* anything *を行いません。 –

+0

私はそのIBActionのコンテンツとカラー/イメージを変更しています。コンテンツはcoreDataから取得されます。私は、ibactionの変更を表示するために、uiviewsを再描画する必要があります。 – 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

あなたが思うようにおそらく動作しないビューコントローラを使って奇妙なことをしているようです。あなたはView Controllerを持っていないと言っていますが、View ControllerでなければDetailViewControllerは何ですか? nibファイルの中にビューコントローラがないことはわかっています。なぜなら、それはnibsの仕組みではありませんが、まだView Controllerを作成していて、それをnibから表示階層に移しているからです。 –

+0

私は新しいメソッドにコードを入れて、このメソッドを呼び出すと私の問題は解決しました。ありがとうございました! – brush51

1

これは、コンテナビュー内でページングを行っている人に役立つ可能性があります。上記のコードは、私にこれを試してみるというアイデアを与えてくれました。スウィフト

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

これは、いくつかの簡単なコピーのニック・ロックウッドの答えのレプリカが

let parent = self.view.superview 
self.view.removeFromSuperview() 
self.view = nil 
parent?.addSubview(self.view) 
関連する問題