我是使用拆分视图创建iPad应用程序的新手。当我第一次使用标准的MasterDetail应用程序模板(Xcode 4.2)创建项目时,它会创建一个MasterViewController和一个DetailViewController。从弹出窗口(主详细信息视图控制器)中选择行时,模板具有以下方法:
- (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编程,你只需要做这种类型的事情就可以将另一个视图控制器推到堆栈上。但是,使用此模板,它只是将详细信息视图推送到弹出窗口而不是更新已存在的内容。我很困惑,我需要更新以从弹出窗口中选择一些内容(主详细信息视图),然后让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上标签的文本。但是,当我单击主视图控制器表中的项目时,没有任何反应。
答案 0 :(得分:8)
有几种不同的方法可以做到。首先,就像你说的那样,删除pushViewController
电话(我不知道为什么Apple的模板会这样做......也许只是为了告诉你可以吗?)。
接下来,让您的MasterViewController了解已经显示的DetailViewController。我通常会在master.detailViewController = detailViewController
中设置appDelegate
。
请记住,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根本没有改变。