0

分割ビュー コントローラーを使用してアプリを開発しています。マスターは、タブ バー コントローラーのサブクラスであり、分割ビュー コントローラーのデリゲートです。その部分は正常に動作しているようで、正しい情報を詳細側にプッシュします - 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を生成したセグエがそのオブジェクトを完全に作成していない、具体的にはツールバープロパティがまだ存在しません。プロセスの後半で、バー ボタン アイテムを追加する方法を理解する必要があると思います。

4

1 に答える 1

0

これが最善の解決策かどうかはわかりませんが、バー ボタン項目がタイトルに追加されなかった理由は、セグエによって提供される新しい詳細 VC オブジェクトにタイトルがまだ追加されていないためだと考えました。詳細 VC の viewDidLayoutSubviews メソッドに次の行を追加して、この問題を解決しました。

self.splitViewBarButtonItem = self.splitViewBarButtonItem;

これはセッターを再度呼び出しますが、今回はタイトルバーが存在した後です。

于 2013-04-01T17:14:58.237 に答える