1

UISplitViewControllerがあります。複数の詳細ビューがあります。詳細ビューにはツールバーがあります。UISplitViewControllerDelegateから提供されたUIBarButtonItemをツールバー間で移動したいと思います。

そこで、UIBarButtonItemへの参照を保存し、ビューを交換するときに、現在の詳細ビューからそれを削除して、新しい詳細ビューに移動します。

UIBarButtonItemは1回だけ機能します。UISplitViewController詳細ペインでViewControllerAから開始すると、項目がツールバーに表示されます。ビューコントローラBに切り替えると、アイテムが削除および追加されていることを確認でき、スペースを占有しますが、新しいツールバーに表示されません。

新しいツールバーに追加するたびにUIBarButtonItemをコピーすることで、これを解決できます。保存した値を使いたいです。

どうしたの?

コード

私のアプリデリゲートは、UISplitViewControllerDelegateでもあります。すべての詳細ビューもUISplitViewControllerDelegateに準拠しています。

// Save
- (void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)pc
{
    /* Omitted code that calls the same method on the current detail view. */
    // Save the item
    self.savedBarButtonItem = barButtonItem;
}

アプリデリゲートにIBActionがあります:

-(IBAction)changeDetailView:(id)sender
{
    /* omitted code to the the new view controller and the current view controller */
    [currentView removeBarButtonItem];

    //This adds the item but the item does not even show up.
    [newView addBarButtonItem:self.savedBarButtonItem];

    // New item with the same target and action works.
    UIBarButtonItem * newItem = 
        [[UIBarButtonItem alloc] initWithTitle:@"Test" style:UIBarButtonItemStyleBordered target:self.savedBarButtonItem.target action:self.savedBarButtonItem.action];
    [newView addBarButtonItem:newItem];

}

そして、詳細ビューコントローラでUIBarButtonItemsを追加および削除する方法は次のとおりです。

-(void)addBarButtonItem:(UIBarButtonItem *)barButtonItem
{
    NSArray * items = self.toolbar.items;
    NSMutableArray * newArr = [NSMutableArray arrayWithCapacity:[items count]+1];
    [newArr addObject:barButtonItem];
    for(NSObject * o in items)
        [newArr addObject:o];
    [self.toolbar setItems:newArr animated:YES];
}

-(void)removeBarButtonItem
{
    NSArray * items = self.toolbar.items;
    NSMutableArray * newArr = [NSMutableArray arrayWithCapacity:[items count]-1];
    for(NSInteger i=1; i<[items count]; i++)
        [newArr addObject:[items objectAtIndex:i]];
    [self.toolbar setItems:newArr animated:YES];
}
4

1 に答える 1

1

この問題は、removeメソッドでのアニメーションの使用が原因であると思われます。ツールバーは、ほとんどの場合、ビューの外でアニメーション化する間、昔の配列への参照を保持します。したがって、私が提案するのは、animatedを変更してみることです。削除でNOに変更し、それで修正されるかどうかを確認します。おそらく両方で試してみてください。それがうまくいくなら、この理論は正しいです。

このアイテムがcustomViewを使用しているかどうかについては言及していませんが、これはより問題になる可能性があります。

于 2012-07-22T14:17:20.553 に答える