我刚开始使用拆分视图来创建iPad应用程序.当我首先使用标准的MasterDetail应用程序模板(
Xcode 4.2)创建项目时,它将创建一个MasterViewController和一个DetailViewController.模板具有以下方法,当从popover表(主详细信息视图控制器)中选择一行时,该方法被调用:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath if (!self.detailViewController) { self.detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil]; } [self.navigationController pushViewController:self.detailViewController animated:YES];
现在我明白当你正在使用一个常规的导航控制器,如果你正在编程一个iPhone,你只是做这种类型的事情推动另一个视图控制器到堆栈.然而,使用这个模板,它只是将细节视图推送到popover,而不是更新已经存在的内容.我很困惑,因为我需要更新以从弹出窗口中选择某些东西(主要细节视图),然后进行detailView更新.
更新:
为了尝试并测试在DetailViewController中为您设置的“detailItem”,我注释掉了pushViewController,并添加了以下内容:
//[self.navigationController pushViewController:self.detailViewController animated:YES]; self.detailViewController.detailItem = @"Test"; // setter in detailViewController - (void)setDetailItem:(id)newDetailItem { if (_detailItem != newDetailItem) { _detailItem = newDetailItem; // Update the view. [self configureView]; } if (self.masterPopoverController != nil) { [self.masterPopoverController dismissPopoverAnimated:YES]; } } - (void)configureView { // Update the user interface for the detail item. // detailDescriptionLabel.text is a IBOutlet to the label on the detailView if (self.detailItem) { self.detailDescriptionLabel.text = [self.detailItem description]; } }
根据这段代码,detailViewController上的标签文本应该被更新.但是,当我单击主视图控制器表中的项目时,没有任何反应.
解决方法
有几种不同的方式可以做到这一点.首先,像你说的一样,删除pushViewController调用(我不知道为什么苹果的模板这样做…也许只是为了告诉你可以吗?
接下来,让您的MasterViewController知道已经显示的DetailViewController.我通常在appDelegate中设置master.detailViewController = detailViewController.
记住,DetailViewController已经被显示,所以你不会总是需要重新配置它(除非你用其他视图替换它)
第一选择
使用委托调用设置信息.声明一个协议,将信息传递给detailView并使其适当显示. Here是一个更详细的描述这个的教程.
第二选择
通过DetailViewController传递一些数据&覆盖setter来刷新detailView. Here是一个更详细的教程.
// in DetailViewController - (void)setDetailItem:(id)newDetailItem { if (detailItem != newDetailItem) { [detailItem release]; detailItem = [newDetailItem retain]; // Update the view. navigationBar.topItem.title = detailItem; NSString * imageName = [NSString stringWithFormat:@"%@.png",detailItem]; [self.fruitImageView setImage:[UIImage imageNamed:imageName]]; } }
编辑:再次查看模板,并且setDetailItem类型代码已经在那里,但是代码正在创建一个全新的detailView,所以在splitViewController上可以查看的detailView根本不会更改.