0

マスタービューが次のように設定された UISplitViewController があります。

UITabBarController
  Tab1:
    UINavigationController -> UIViewController -> UIViewController
  Tab2:
    UINavigationController -> UIViewController

各 UIViewControllers はテーブル ビューであり、ユーザーが最後の行を選択すると、UIScrollView を含む詳細ビューに画像が表示されます。

タブ バー コントローラーは UISplitViewControllerDelegate であり、スクロール ビューの上部にあるツールバーにボタンを配置する処理を行います。

問題は、ユーザーが選択したときにポップオーバーを閉じるコードを追加したいということです。ポップオーバーへのポインターは、ボタンが上に移動したときにタブバーコントローラーに保存する必要があり、ユーザーが最終的な選択を行ったときに、いくつかのビューコントローラーの行を下ってポップオーバーを閉じるために使用されます。そのポインターを必要とするView Controllerが、App Delegateに格納するなどのひどいことをせずに、そのポインターを取得する方法はないようです。

他の人がこの質問をしているのを見たことがないので、単純なことを見落としていると思います。教えてください!

4

2 に答える 2

0

タブバーコントローラーはすでにのサブクラスのUITabBarControllerようです。つまり、カスタムコードがすでに含まれているということです。タブバーコントローラーがポップオーバーの主な所有者であり、選択が行われたことをタブバーコントローラーに通知するのはテーブルビューコントローラーの責任であることをお勧めします。タブバーコントローラーは、ポップオーバーを閉じることでそのメッセージに応答できます。UIViewController特定のコントローラーを含むタブバーコントローラーにアクセスするためのメソッドがすでにあるという事実を利用できます。

したがって、次のようになります。

@interface MyTabBarController : UITabBarController
- (void)itemWasSelected;
@end

@implementation MyTabBarController {
  UIPopoverController *popover;
}

- (void)itemWasSelected {
  [popover dismissPopoverControllerAnimated:YES];
}
@end

//////////////

@implementation TableController

- (void)tableView:(UITableView *)tv didSelectRowAtIndexPath:(NSIndexPath *)path {
  // Do whatever else you want to do
  MyTabBarController *tabController = (MyTabBarController *)self.tabBarController;
  [tabController itemWasSelected];
}

このソリューションでは、テーブルコントローラーはポップオーバーについて何も知る必要がありません。内に表示されるMyTabBarControllerことを知っている必要があります。これは、知るのに合理的なことのようです。

于 2012-06-23T00:47:13.770 に答える
0

シングルトン クラスを作成してポップオーバー ステータスを追跡し、それをすべてのクラスで均等かつ簡単に利用できるようにすることができます。そうすれば、基本的に同じアイデアですが、独自のシングルトンで少しクリーンであるにもかかわらず、アプリデリゲートに直接負担をかけることなく、任意のコードから簡単に更新およびアクセスできます。

于 2012-06-18T22:21:04.973 に答える