3

ストーリーボードを使用してこのコードのバージョンを作成しようとしています:

ナビゲーション テーブルで選択したセルに応じて、2 つの異なる詳細ビューを切り替えられるようにしたいと考えています。別のセルが選択されるたびに詳細ビューを交換するカスタム セッター メソッドを使用して SplitViewManager を作成することにより、これを実装しようとしました。これは、Apple のサンプル コードで使用されているのと同じアプローチです。SplitViewManager はデリゲートに従います。

私の問題は、splitViewController.delegate を何にも接続していないため、splitViewManager を何にも割り当てることができないことだと思います。しかし、ストーリーボードでデリゲートを何に接続するかさえわかりません。私がここでばかであるかどうか教えてください(ほぼ間違いなく)。ありがとう!

私のコードは以下の通りです:

DFMAppDelegate.m:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.splitViewController = (UISplitViewController *)self.window.rootViewController;
    self.splitViewManager = (DFMSplitViewManager *)self.splitViewController.delegate;

    NSLog(@"split view controller: %@", self.splitViewController); // not null
    NSLog(@"split view controller delegate: %@", self.splitViewController.delegate); // is null
    NSLog(@"split view manager: %@", self.splitViewManager); // is null.

    // But i'm not sure how to assign splitViewController.delegate or splitViewManager in the storyboard.

    return YES;
}

DFMSplitViewManager.m:

- (void)setDetailViewController:(UIViewController<SubstitutableDetailViewController> *)detailViewController
{
    self.detailViewController = detailViewController;

    // Update the split view controller's view controllers array.
    // This causes the new detail view controller to be displayed.
    UIViewController *navigationViewController = [self.splitViewController.viewControllers objectAtIndex:0];
    NSArray *viewControllers = [[NSArray alloc] initWithObjects:navigationViewController, self.detailViewController, nil];
    self.splitViewController.viewControllers = viewControllers;
}

DFMMasterViewController.m:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    DFMAppDelegate *appDelegate = (DFMAppDelegate *)[[UIApplication sharedApplication] delegate];

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];

    if (indexPath.row == 0) {
        NSLog(@"clicked cell 1");

        DFMDetailViewController *detailViewController = [storyboard instantiateViewControllerWithIdentifier:@"ViewController"];

        [appDelegate.splitViewManager setDetailViewController:detailViewController];

    }
    else {
        NSLog(@"clicked cell 2");

        DFMDetailCollectionViewController *detailCollectionViewController = [storyboard instantiateViewControllerWithIdentifier:@"CollectionViewController"];

        [appDelegate.splitViewManager setDetailViewController:detailCollectionViewController];
    }
}
4

2 に答える 2

2

Interface Builder を使用して NSObject を View Controller に追加できることがわかりました。それを行ったら、NSObject のクラスを DFMSplitViewManager に変更し、それを SplitViewController のデリゲートとして設定しました。そこからは非常に簡単でした。

于 2013-10-24T17:36:46.693 に答える
1

私はあなたとまったく同じ問題に直面しています。あなたが解決策を見つけるかどうかはわかりませんが、ここに私が見つけた解決策があります。

AppDelegate.m で次のコードを使用します

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{    
    // Override point for customization after application launch.
    UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;

    self.detailViewManager = [[DetailViewManager alloc] init];
    self.detailViewManager.splitViewController = splitViewController;
    self.detailViewManager.detailViewController = splitViewController.viewControllers.lastObject;
    splitViewController.delegate = self.detailViewManager;

    if ([splitViewController respondsToSelector:@selector(setPresentsWithGesture:)])
    [splitViewController setPresentsWithGesture:YES];

    return YES;
}  

コードの残りの部分は、Apple が提供したものと同じです。

基本的にself.detailViewManagerは、分割ビュー コントローラーです。テーブル内のセルを選択するself.detailViewManagerと、詳細ビ​​ューがリセットされます (私が間違っていなければ)。私は Xcode を初めて使用するので、間違っている場合は修正してください。

ここにソリューションリンクがあり、ホールマークで回答されています。

于 2014-03-19T21:19:54.510 に答える