3

タブの1つにアプリの設定が表示されるUITabBarControllerアプリがあります。これは、マスターで選択されたものに応じて変更される複数の詳細コントローラーを備えたUISplitViewControllerです。私のdetailViewControllersには、マスタービューが継続的に表示できる(または表示する必要がある)次の行があります。

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.splitViewController.delegate = self;
}

- (BOOL) splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation {
    return NO;
}

これが私の問題です。[設定]タブをタップしたときにパッドが縦向きの場合、最初の詳細ビューのみが表示されます。マスターではありません。パッドを横向きに回転させて戻すと、マスターは問題なく表示され、そこにとどまります。

なぜこれが起こっているのか理解できません。マスターを非表示にしないようにdetailControllerを更新した後、XCode4.5.2マスター/詳細テンプレートプロジェクトでこの問題は発生しません。

何か案は?

4

4 に答える 4

3

これと同じ問題が発生しましたが、UISplitViewControllerデリゲートが適切なタイミングで設定されていることを再確認することで問題を解決しました。

これが正しく機能するXCodeサンプルプロジェクトのAppDelegateで行われていることに注意してください。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
        UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
        UINavigationController *navigationController = [splitViewController.viewControllers lastObject];
        splitViewController.delegate = (id)navigationController.topViewController;
    }
    return YES;
}

具体的には、UISplitViewControllerデリゲートを特定のViewControllerに設定します。

私の目的では、AppDelegateをSplitViewControllerDelegateに設定しました。これは、SplitViewController内で少し複雑なビューコントローラー管理が行われているためです。

したがって、デリゲートがapplication:didFinishLaunchingWithOptions:内で適切に設定されていることを確認してください。問題はないはずです。

于 2012-12-04T22:37:44.333 に答える
1

この問題を修正するには、元の質問で使用したのと同じコードを実行する必要がありましたが、それをサブクラス化されたUISplitViewControllerに配置しました。もともと私はそれを詳細ビューに入れていました。

于 2012-12-05T17:00:27.053 に答える
0

この問題に対して私が見つけた簡単な修正は、AppDelegateにオリエンテーションデリゲートがあることを確認することでした。

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return YES;
}
于 2013-02-18T10:33:34.263 に答える
0

手遅れだとは思いますが、私がこれからどのように脱出するかを示したいので、他の人が利益を得ることができます。

- (IBAction)hideMaster
{
   // 1. set desired width for master view
   [self.splitViewController setValue:[NSNumber numberWithFloat:0.0] forKey:@"_masterColumnWidth"];

   // 2. splitViewController delegate to self
   self.splitViewController.delegate = self;

  // 3. give a smooth animation

  [UIView animateWithDuration:1.0 animations:^{
      [self.splitViewController.view layoutSubviews];
  }];
}

- (BOOL)splitViewController: (UISplitViewController*)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation  __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0);
{
    return NO;
}
于 2014-10-16T16:56:32.120 に答える