分割ビュー コントローラーを使用してアプリを開発しています。マスターは、タブ バー コントローラーのサブクラスであり、分割ビュー コントローラーのデリゲートです。その部分は正常に動作しているようで、正しい情報を詳細側にプッシュします - Split View Controller が生成するバー ボタン項目を除きます。
プロジェクト内の唯一の詳細ビュー コントローラーに Xcode でドラッグされた UIToolbar があります。ctrl-drag を使用して、Xcode でパブリック API へのアウトレットを設定しました。
また、パブリック API で宣言されている UIBarButtonItem *splitViewBarButtonItem は、weak で非アトミックと宣言されています。
そのアイテムのセッターは次のとおりです。
-(void)setSplitViewBarButtonItem:(UIBarButtonItem *)barButtonItem
{
NSLog(@"%@ setSplitViewBarButtonItem to %@ (%@)",self,barButtonItem,barButtonItem.title);
//UIToolbar *toolbar = [self toolbar];
UIToolbar *toolbar = self.toolbar;
NSLog(@"toolbar[0] before adding the barButtonItem is %@",toolbar.items[0]);
NSMutableArray *toolbarItems = [toolbar.items mutableCopy];
if (_splitViewBarButtonItem)
{
NSLog(@"Removing _splitViewBarButtonItem from toolbarItems");
[toolbarItems removeObject:_splitViewBarButtonItem];
NSLog(@"toolbarItems[0] is %@",toolbarItems[0]);
}
if (barButtonItem)
{
NSLog(@"#####");
NSLog(@"Now adding %@ to toolbarItems",[barButtonItem description]);
[toolbarItems insertObject:barButtonItem atIndex:0];
NSLog(@"toolbarItems[0] is %@",[toolbarItems[0] description]);
NSLog(@"#####");
}
self.toolbar.items = [toolbarItems copy];
NSLog(@"self.toolbar.items[0] is %@",self.toolbar.items[0]);
_splitViewBarButtonItem = barButtonItem;
}
最初は、期待どおりに動作します。
2013-04-01 10:33:46.270 SPoT[10389:907] <IViewController: 0x1e066430> setSplitViewBarButtonItem to <UIBarButtonItem: 0x1cd65490> (Text appearing on the button)
2013-04-01 10:33:46.272 SPoT[10389:907] toolbar[0] before adding the barButtonItem is <UIBarButtonItem: 0x1cd65400>
2013-04-01 10:33:46.275 SPoT[10389:907] #####
2013-04-01 10:33:46.277 SPoT[10389:907] Now adding <UIBarButtonItem: 0x1cd65490> to toolbarItems
2013-04-01 10:33:46.278 SPoT[10389:907] toolbarItems[0] is <UIBarButtonItem: 0x1cd65490>
2013-04-01 10:33:46.280 SPoT[10389:907] #####
2013-04-01 10:33:46.288 SPoT[10389:907] self.toolbar.items[0] is <UIBarButtonItem: 0x1cd65490>
ただし、ボタンを使用してマスターをアクティブにしてボタンを非表示にし、マスターを使用して詳細画面を新しいデータで更新すると、ボタンの転送が行われません。ボタンが使用可能であることが示されているが、更新されていないこのメソッドに問題を追跡しました。2 回目の実行からのデバッガー出力は次のとおりです。
2013-04-01 10:33:53.491 SPoT[10389:907] <IViewController: 0x1e09fad0> setSplitViewBarButtonItem to <UIBarButtonItem: 0x1cd65490> (Text appearing on the button)
2013-04-01 10:33:53.492 SPoT[10389:907] toolbar[0] before adding the barButtonItem is (null)
2013-04-01 10:33:53.493 SPoT[10389:907] #####
2013-04-01 10:33:53.494 SPoT[10389:907] Now adding <UIBarButtonItem: 0x1cd65490> to toolbarItems
2013-04-01 10:33:53.495 SPoT[10389:907] toolbarItems[0] is (null)
2013-04-01 10:33:53.496 SPoT[10389:907] #####
2013-04-01 10:33:53.497 SPoT[10389:907] self.toolbar.items[0] is (null)
デバッガーのトレースに「Now added 」と表示されているため、アイテムが使用可能であることに注意してください。では、なぜ追加されないのでしょうか。
編集:今、「barButtonItemを追加する前のtoolbar [0]は(null)」であるため、新しい詳細コントローラーのオブジェクトIDを生成したセグエがそのオブジェクトを完全に作成していない、具体的にはツールバープロパティがまだ存在しません。プロセスの後半で、バー ボタン アイテムを追加する方法を理解する必要があると思います。