web-dev-qa-db-ja.com

UISplitViewControllerはnib / xibを使用せずにプログラムで

私は通常、IBスタッフなしでプロジェクトを作成します。最初に行うことは、xib、アウトレットの更新されたplistなどへのすべての参照を削除することです。 (私の世界では)問題なく動作します!

さて、3.2をインストールして、初めてのiPadアプリを開発しようとしました。前と同じ手順に従って、UISplitViewベースのアプリケーションプロジェクトを作成し、すべてのIBを削除しました。また、Appleのリファレンスドキュメントのセクションに従いました: プログラムによるSplit View Controllerの作成 、それにもかかわらず、マスタービューは表示されず、詳細のみ-viewは(向きに関係なく)です。私は本当にこれを注意深く見ようとしましたが、私が見逃したことを理解できません。

ペン先がどこかに浮かんでいないUISplitViewControllerの動作例はありますか? Googleで検索しましたが、見つかりませんでした。または、おそらく私が見逃したことを知っていますか?

47
Steve

デリゲートヘッダーでsplitviewcontrollerを宣言し、didfinishlaunchingでこのようなものを使用します

uISplitViewControllerDelegateをDetailedViewControllerヘッダーファイルに追加し、デリゲートメソッドも持っていることを確認してください。関連するヘッダーファイルをインポートすることを忘れないでください

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{    

    splitViewController = [[UISplitViewController alloc] init];

    rootViewController *root = [[rootViewController alloc] init];
    detailedViewController *detail = [[detailedViewController alloc] init]; 

    UINavigationController *rootNav = [[UINavigationController alloc] initWithRootViewController:root];

    UINavigationController *detailNav = [[UINavigationController alloc] initWithRootViewController:detail];

    splitViewController.viewControllers = [NSArray arrayWithObjects:rootNav, detailNav, nil];
    splitViewController.delegate = detail;

    [window addSubview:splitViewController.view];

編集-以下のスコットの優れた提案に従って、代わりにウィンドウのサブビューに追加しないでください

    [self.window setRootViewController:(UIViewController*)splitViewController];  // that's the ticket
    [window makeKeyAndVisible];
    return YES;
}


//detailedView delegate methods
- (void)splitViewController:(UISplitViewController*)svc 
     willHideViewController:(UIViewController *)aViewController 
          withBarButtonItem:(UIBarButtonItem*)barButtonItem 
       forPopoverController:(UIPopoverController*)pc
{  
    [barButtonItem setTitle:@"your title"];



    self.navigationItem.leftBarButtonItem = barButtonItem;
}


- (void)splitViewController:(UISplitViewController*)svc 
     willShowViewController:(UIViewController *)aViewController 
  invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
    self.navigationItem.leftBarButtonItem = nil;
}

私もIBよりコードを好む;-)

58
Nik Burns

古いスレッドですが、上記の手法がデバイスの向きの変更イベントに正しく応答するUISplitViewControllerの生成に失敗した場合、読者の時間と悲しみをspareしまないと思いました。あなたがする必要があります:

  1. ShouldAutorotateToInterfaceOrientationですべての従属ビューが適切に応答することを確認します。ここに新しいものはありません。
  2. UISplitViewControllerのビューをメインウィンドウに追加するのではなく、

    [window addSubview:splitViewController.view];   // don't do this
    

    代わりに、メインウィンドウのルートコントローラーをUISplitViewControllerに設定します。

    [self.window setRootViewController:(UIViewController*)splitViewController];  // that's the ticket
    

Splitviewcontrollerのビューをメインウィンドウのサブビューとして(かろうじて)追加すると、兄弟ビューと共存できますが、UISplitViewControllerの目的のユースケースとは連動しません。 UISplitViewControllerはハイランダービューです。 1つしか指定できません

23
Scott Honji

私は同じ問題に出会ったばかりです。 splitviewの子viewControllerがインターフェイスの向きに自動回転できることを確認してください。

次のように、childViewControllerの関数を変更できます。

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return YES;
}

その後、マスタービューが表示されます。

3
ziqian hu

Swift 5. version(マスタービューコントローラーと詳細ビューコントローラーの両方がNavigation Controllerに組み込まれています)

    let splitViewController =  UISplitViewController()
    splitViewController.delegate = self
    let masterVC = MasterViewController() 
    let detailVC = DetailViewController()
    let masterNavController = UINavigationController(rootViewController: masterVC)
    let detailNavController = UINavigationController(rootViewController: detailVC)
    splitViewController.viewControllers = [masterNavController,detailNavController]

このコードをAppDelegateのdidFinishLaunchingWithOptions関数に配置できます。 splitViewControllerrootViewControllerのようにすることを忘れないでください

    self.window!.rootViewController = splitViewController
1
Bartosz Kunat