如何使用MasterDetail应用程序模板更新DetailView

我不熟悉使用分割视图来创buildiPad应用程序。 当我第一次使用标准的MasterDetail Application模板(Xcode 4.2)创build项目时,它创build了一个MasterViewController和一个DetailViewController。 从popup式表格(主细节视图控制器)中select一行时,模板具有以下方法:

- (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上,而不是更新已经存在的内容。 我很困惑,因为我需要更新从popup窗口(主细节视图)中select一些东西,然后有detailView更新。

更新:

为了试着在DetailViewController中testing已经为你设置的“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已经被显示,所以你不会总是需要重新分配它(除非你用其他视图来replace它)

第一select

使用委托调用来设置信息。 声明一个协议将信息传递给detailView并使其适当地显示。 这里是一个教程更详细地描述这个。

第二个选项

传递DetailViewController的一些数据并重写setter来刷新detailView。 这里是一个教程更详细地描述这个。

 // 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]]; } } 

编辑 :再次看了一下模板,并且setDetailItemtypes代码已经在那里,但是代码创build了一个全新的detailView,所以在splitViewController上可以看到的detailView根本没有改变。