0

アプリ用のマスター/ディテール コントローラーがあります。マスター コントローラーは UITabBarController で、各タブはさまざまな種類のデータを含む UITableViewController です。

メインの詳細ビューにメインのヘッダー/画像を配置する予定ですが、使用しているタブに応じて特定の情報を詳細に表示するために、メインの詳細ビューにさまざまなサブビューを追加する必要があります。

現在、関連するサブビューを私の

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

次のように機能します。

UIViewController *subview = [[UIViewController alloc] initWithNibName:@"ItemNotFoundViewController" bundle:nil];
subview.view.frame = CGRectMake(20, 160, subview.view.frame.size.width, subview.view.frame.size.height);  
[self.detailViewController.view addSubview:subview.view];

ただし、これは不適切な方法だと思います。誰かがテーブル セルをクリックするたびに、以前に追加されたサブビューのスタックの上に別のサブビューがスローされ、メモリの問題が発生します。

私が疑問に思っているのは、ARC がこれを処理してくれるのでしょうか? 私のアプローチはまずまずですか?たとえそれがまずまずだとしても、これを行うためのより良い方法はありますか?

4

2 に答える 2

2

まず第一に、いいえ。ARC はこれを処理しません。それを行うのは目的ではありません。たとえそうであったとしても、以前に追加されたサブビューがもう必要ないことをどうやって知ることができますか? これらのサブビューを自分で削除する必要があり ARC がそれらの割り当てを解除します (それらへの他の参照がない場合)。

とにかく、それはUISplitViewController(マスター詳細ビューコントローラー)を使用することになっている方法ではありません。お気づきのように、分割ビュー コントローラーは他の 2 つのビュー コントローラーを処理します。masterViewController と detailViewController。ほとんどの場合、アプリの実行中にマスター ビュー コントローラーは変更されませんが (コンテンツは変更されますが、通常UINavigationControllerは masterViewController として割り当てられているようなコンテナー ビュー コントローラーによって処理されます)、詳細ビュー コントローラーは変更されます。

サブビューを既存の detailViewController に追加する代わりに、新しいビューに置き換える必要があります。そのため、詳細セクションに表示するすべてのビュー コントローラーに対して個別の XIB を作成する必要があります (既に行っているようです)。コードを次のように変更します

self.detailViewController = newDetailViewController; //newDetailViewController would be the vc you called subview in your code

それ以外の

[self.detailViewController.view addSubview:subview.view];

detailViewController編集:これは、値を設定したときにプロパティが「正しいこと」を行うことを前提としていることに注意してください。デフォルトでは、最初のオブジェクトが masterVC で 2 番目のオブジェクトが detailVC であるとUISplitViewController呼ばれるプロパティのみがあります。viewControllersNSArray

それを管理する方法の例については、MultipleDetailViewsをご覧ください。

すべての詳細View Controllerにヘッダービューを持たせたいので、それを達成するためのさまざまな選択肢があります(設計に応じて、ケースに適用できる場合と適用できない場合があります):

  • すべての詳細 VC の XIB にヘッダー ビューを追加します。
  • すべての detailVC に対して多くの XIB を作成する代わりに、UIViewController指定したパラメーターに基づいてコンテンツを変更する新しいカスタム サブクラスを作成します。つまり、どの tableViewCell がユーザーによってタップされたかを示します。
  • 2 つの子ビュー コントローラー (1 つは見出し用、もう 1 つはその上のコンテンツ用) を管理するカスタム コンテナー ビュー コントローラーを作成します。

カスタム コンテナ ビュー コントローラの詳細UISplitViewControllerについては、次を参照してください。

ビューコントローラーの基本

カスタム コンテナ ビュー コントローラの作成

于 2012-10-31T18:56:11.720 に答える
0

いいえ、ARCはこれを引き受けません。detailViewController.viewはそのサブビューへの参照を保持するためです。これらのビューで何をしているのかを詳しく知らなければ、どのアプローチが最適かを判断するのは困難です。新しいViewControllerを提示する方がおそらく良いでしょう。それを指すプロパティがない場合は、却下された後に割り当てが解除されます。

于 2012-10-31T18:39:23.717 に答える