【问题标题】:Accessing a UITableView when a UINavigationController gets in the way (in a UISplitViewController)当 UINavigationController 妨碍时访问 UITableView(在 UISplitViewController 中)
【发布时间】:2012-03-08 02:45:04
【问题描述】:

我有一个这样设置的 UISplitViewController:

-(IBAction)makeStory:(id)sender{
NSLog(@"makeStory:");

    makeStoryTableViewController = [[MakeStoryTableViewController alloc] initWithNibName:@"MakeStoryTableViewController" bundle:nil];
    MakeSentenceTableViewController *detailViewController = [[MakeSentenceTableViewController alloc] initWithNibName:@"MakeSentenceTableViewController" bundle:nil];
    UISplitViewController *splitViewController = [[[UISplitViewController alloc] init] autorelease];

    UINavigationController *rootNav = [[[UINavigationController alloc] initWithRootViewController:makeStoryTableViewController]autorelease];

    UINavigationController *detailNav = [[[UINavigationController alloc] initWithRootViewController:detailViewController] autorelease];

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

    StoryBotAppDelegate *appDelegate = (StoryBotAppDelegate *)[[UIApplication sharedApplication] delegate];
    [appDelegate.window setRootViewController:splitViewController];
}

当我尝试在 UISplitView 委托中设置 detailView 作为 didSelectRowAtIndexPath: 的结果时,我只能访问 NavigationController:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {   
    NSLog(@"ViewControllers: %@", [self.splitViewController viewControllers]);
    MakeSentenceTableViewController *detailViewController = [[self.splitViewController viewControllers] objectAtIndex:1];
    Story *storySet = [fetchedResultsController objectAtIndexPath:indexPath];
    NSLog(@"detailViewController: %@", detailViewController); //Logs a UINavigationController
    [detailViewController setStory:storySet]; //Fails here because Navigation Controllers Can't setStory!
    [detailViewController refreshTables];
} 

这很有意义,但是我如何访问 UINavigationController 负责的 TableView?如果我删除 *rootNav 和 *detailNav 并用 splitViewController.viewControllers 语句中的 UITableViews 替换它们,它可以正常工作,但是我没有导航栏:

    MakeSentenceTableViewController *detailViewController = [[MakeSentenceTableViewController alloc] initWithNibName:@"MakeSentenceTableViewController" bundle:nil];
    UISplitViewController *splitViewController = [[[UISplitViewController alloc] init] autorelease];

    //UINavigationController *rootNav = [[[UINavigationController alloc] initWithRootViewController:makeStoryTableViewController]autorelease];

    //UINavigationController *detailNav = [[[UINavigationController alloc] initWithRootViewController:detailViewController] autorelease];

    splitViewController.viewControllers = [NSArray arrayWithObjects:makeStoryTableViewController, detailViewController, nil];
    splitViewController.delegate        = makeStoryTableViewController;

    StoryBotAppDelegate *appDelegate = (StoryBotAppDelegate *)[[UIApplication sharedApplication] delegate];
    [appDelegate.window setRootViewController:splitViewController];

如何访问 Detail TableView 控制器并保留导航栏?

【问题讨论】:

    标签: ios cocoa-touch ipad uitableview uisplitviewcontroller


    【解决方案1】:

    这就是我的想法。我犯了两个错误,在这些错误中我不得不使用 UINavigationController.viewControllers ObjectAtIndex: 属性。

    1. 在函数 makeStory 中,我错误地将 UINavigationController 分配为委托而不是 makeStoryTableViewController。我通过这样做来修复它,而不是(特别注意 splitViewController.delegate 部分):

      MakeSentenceTableViewController *detailViewController = [[MakeSentenceTableViewController alloc] initWithNibName:@"MakeSentenceTableViewController" bundle:nil]; 
      UISplitViewController *splitViewController = [[[UISplitViewController alloc] init] autorelease];
      
      UINavigationController *rootNav = [[[UINavigationController alloc] initWithRootViewController:makeStoryTableViewController]autorelease];
      
      UINavigationController *detailNav = [[[UINavigationController alloc] initWithRootViewController:detailViewController] autorelease];
      
      splitViewController.viewControllers = [NSArray arrayWithObjects:rootNav, detailNav, nil];
      
      //splitViewController.viewControllers = [NSArray arrayWithObjects:makeStoryTableViewController, detailViewController, nil];
      //RootViewController *root = (RootViewController *)[navigationController.viewControllers objectAtIndex:0]
      
      splitViewController.delegate        = [rootNav.viewControllers objectAtIndex:0];
      
      NSLog(@"delegate: %@",  [rootNav.viewControllers objectAtIndex:0]);
      
      StoryBotAppDelegate *appDelegate = (StoryBotAppDelegate *)[[UIApplication sharedApplication] delegate];
      NSLog(@"RootViewController: %@", appDelegate.window);
      
      [appDelegate.window setRootViewController:splitViewController];
      
      NSLog(@"AppDelegate.window: %@", appDelegate.window.rootViewController);
      
    2. 我又犯了同样的错误,这次是在 didSelectRowAtIndexPath: 中,并试图在 UINavigationController 中设置 setStory。为了修复它,我做了这个(特别注意关于 navControllerDetail.viewControllers 的一点:

      UINavigationController *navControllerDetail;
      navControllerDetail = [[self.splitViewController viewControllers] objectAtIndex:1];
      
      
      
      MakeSentenceTableViewController *detailViewController;
      
      detailViewController = [navControllerDetail.viewControllers objectAtIndex:0];
      
      Story *storySet = [fetchedResultsController objectAtIndexPath:indexPath];
      
      
      
      NSLog(@"detailViewController: %@", detailViewController);
      [detailViewController setStory:storySet];
      [detailViewController refreshTables];
      

    如果我能弄清楚如何获得SplitViewController to rotate properly!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-17
      • 2021-09-11
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多