5

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

私はこれをやっていますが、私にはうまくいきません.理由はわかりません..:

//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 には、viewcontroller がなく、uiview だけがあり、ここに階層があります。

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

私が期待していること:

* UIView をリセットしたくありません。背景とその内容を変更したいです。*

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

IBAction を使用して、coreData 行を反復処理し、アクションが呼び出された場合に現在の次の行を表示したい..など..

ログでは、データは変更されますが、UIViews には表示されません。この原因は、現在のデータを表示するために、再描画またはリロードなどが必要です。

EDIT 2:
解決済みコードを新しいメソッドに入れ、このメソッドを呼び出すと問題が解決しました。

4

3 に答える 3

19

ビューとサブビューをnibファイルのデフォルト状態にリセットしようとしていますか?

その場合、上記のアプローチは機能しません。これを自動的に行う唯一の方法は、ペン先からビューを再ロードすることですが、私が手助けする前に、ビューをどのようにロードしているかを最初に明確にする必要があります。

View Controllerにロードしている場合、更新する最も簡単な方法は、View Controllerを画面から削除して再作成することですが、次のように言ってビューをリロードできる場合があります(コントローラー内から):

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...] または同等のものを使用して nib からビューを直接ロードしている場合、ビューをリロードする最善の方法は、ビューを破棄してそのメソッドを再度呼び出すことです。

于 2012-01-23T22:45:47.253 に答える
8

スイフト2

これは、簡単にコピーして貼り付けるための Nick Lockwood の回答のレプリカです。

let parent = self.view.superview
self.view.removeFromSuperview()
self.view = nil
parent?.addSubview(self.view)
于 2016-02-12T05:59:07.830 に答える
1

これは、コンテナビュー内のページングで誰かを助けるかもしれません. 上記のコードは、これを試すというアイデアを私に与えてくれました。

[self.pageViewController.view removeFromSuperview];
self.pageViewController.view = nil; // unloads the view
[self performSegueWithIdentifier:@"pageViewSegue" sender:self];
于 2013-08-09T13:34:26.663 に答える