3

アプリに次のビュー コントローラー構造があります。

(ナビゲーション バーではない) を持つコンテナービューコントローラーには が埋め込まれており、これにより追加の子ビュー コントローラーが表示されます。UIToolBarUIPageViewControllerUIPageViewController

container view controller (toolBar) -> PageViewController -> ViewController 1,
                                                             ViewController 2

提示された子View Controller 1および2に応じて、コンテナView Controllerのツールバーにボタン(BarButtonItems)を追加および削除したいと思います。

  1. 子ビュー コントローラー 1 と 2 がコンテナー ビュー コントローラーのツールバーにアクセスして、ボタンを追加および削除するにはどうすればよいでしょうか?

  2. コンテナView ControllerのtoolbarItemsプロパティは、ボタンがあっても常に0のようです。なぜこれが考えられるのかについてのアイデアはありますか?toolbarItemsプロパティ <> 0 はナビゲーション バーのみですか?

編集

ユーザー DBD からの提案に基づいて、次のメソッドをビュー コントローラーに追加しました。CompanyViewControllerこれはツールバーを持ち、分割ビューの詳細ウィンドウのビュー コントローラーの基本クラスです (すべての詳細ビュー コントローラーは から継承しますCompanyViewController)。これらの詳細ビュー コントローラーの 1 つは、前述のページ ビュー コントローラーおよび子ビュー コントローラーと共にコンテンツ ビュー コントローラーとして使用されます。

CompanyViewController:

- (void)addToolBarItems:(NSArray *)buttonArray
{
    NSMutableArray *items = [[self.toolbar items] mutableCopy];
    
    [buttonArray enumerateObjectsUsingBlock:^(UIBarButtonItem *barButtonItem, NSUInteger idx, BOOL *stop) {
        if (! [items containsObject:barButtonItem] ) [items insertObject:barButtonItem atIndex:0];
    }];
    [self.toolbar setItems:items animated:NO];
}

- (void)removeToolBarItems:(NSArray *)buttonArray;
{
    NSMutableArray *items = [[self.toolbar items] mutableCopy];
    
    [buttonArray enumerateObjectsUsingBlock:^(UIBarButtonItem *barButtonItem, NSUInteger idx, BOOL *stop) {
        if ( [items containsObject:barButtonItem] ) [items removeObjectAtIndex:idx];
    }];
    [self.toolbar setItems:items animated:NO];
}

これは、子コントローラーCompanyViewControllerからにアクセスしようとする方法です。

- (CompanyViewController*)parentViewControllerWithToolbar
{
    UIViewController *parentPageViewController = self.parentViewController;
    CompanyViewController *parentContentViewController = (CompanyViewController*)parentPageViewController.parentViewController;
    return (CompanyViewController*)parentContentViewController;
}

ただし、子ビュー コントローラーからメソッドを呼び出そうとすると、addToolBarItemsXcode のオートコンプリートでメソッドを取得できません。インポートしたにもかかわらず、このメソッドにアクセスできないようです#import "CompanyViewController.h"

ここで欠けている可能性のあるものについて何か提案はありますか?

4

1 に答える 1

3

ツールバーに直接アクセスしないことをお勧めします。代わりに、次のようなパブリック メソッドを持つコンテナー クラスをお勧めします。

- (void)addToolBarItem:(UIBarButtonItem *)button atIndex:(int)index;
- (void)removeToolBarItemAtIndex:(int)index;

次に、子供がしなければならないのは、親を取得し、おそらく型キャストを実行してメソッドを呼び出すことだけです。

このように UI の変更をカプセル化すると、子クラスで重複する可能性のあるコードを使用してツールバーを変更する必要がなくなり、Apple による API の変更から多くのコードを保護し、ツールバーをカスタムのようなものに交換することを簡単に決定できるようになります。コード変更の影響を波及させることなく、将来的に制御します。

編集:

.ではなく、コンテナー ビュー コントローラーを使用していると思いましたUISplitViewController。私の理解を再度述べるつもりですので、間違っていたら教えてください。

UISplitViewController「マスター」ビューと「詳細」ビューを表示しています。詳細ビューからマスターにコールバックし、ツールバーの変更を要求します。

詳細View Controllerでは、マスターが必要ですが、「親」を呼び出すだけでUISplitViewController. したがって、分割ビュー コントローラーにアクセスし、そこからマスター ビュー コントローラーを取得する必要があります。

MasterViewController *foo = [self.splitViewController.viewControllers objectAtIndex:0];
[foo removeToolBarItems:bar];

つまり、私が属している を取得UISplitViewControllerし (呼び出し元の親と同じ)、それが保持するビュー コントローラーの配列にアクセスします。配列の最初の項目を取得し、マスター ビュー コントローラーとして割り当てます。上のドキュメントからUISplitViewController

viewControllers
レシーバーによって管理されるビュー コントローラーの配列。

@property(nonatomic, copy) NSArray *viewControllers

解説
このプロパティの配列には、正確に 2 つのビュー コントローラーが含まれている必要があります。分割ビュー インターフェイスが横向きの場合、View Controller は左から右に表示されます。したがって、インデックス 0 のビュー コントローラーはインターフェースの左側に表示され、インデックス 1 のビュー コントローラーは右側に表示されます。

于 2012-10-05T16:45:20.683 に答える