当 UINavigationController 妨碍时访问 UITableView(在 UISplitViewController 中)
Posted
技术标签:
【中文标题】当 UINavigationController 妨碍时访问 UITableView(在 UISplitViewController 中)【英文标题】:Accessing a UITableView when a UINavigationController gets in the way (in a 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 控制器并保留导航栏?
【问题讨论】:
【参考方案1】:这就是我的想法。我犯了两个错误,在这些错误中我不得不使用 UINavigationController.viewControllers ObjectAtIndex: 属性。
在函数 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);
我又犯了同样的错误,这次是在 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!
【讨论】:
以上是关于当 UINavigationController 妨碍时访问 UITableView(在 UISplitViewController 中)的主要内容,如果未能解决你的问题,请参考以下文章
当 rootViewController 不是 UINavigationController 时推送视图
当 UIViewController 模态显示时,UINavigationController(在 UITabBarController 选项卡内)丢失堆栈
UIRefreshControl - 当 UITableViewController 在 UINavigationController 中时,beginRefreshing 不起作用
当 UITextField 在 modalView 中有第一响应者时,UINavigationController 堆栈错误
当应用程序 rootViewController 是 tabBarController 时 UINavigationController 的奇怪行为
当 UISplitViewController 旋转为纵向时,如何调整 UINavigationController 内容的大小