我刚开始使用分割视图来创建 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 编程,您只需执行此类操作即可将另一个视图控制器推送到堆栈上。但是,使用此模板,它只是将详细视图推送到弹出窗口上,而不是更新已存在的内容。我很困惑我需要更新什么才能从弹出窗口(主详细视图)中选择某些内容,然后更新详细视图。
Update:
为了尝试测试 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。我通常设置master.detailViewController = detailViewController
in the appDelegate
.
请记住,DetailViewController 已经被显示,因此您并不总是需要重新分配它(除非您将其替换为其他视图)
第一个选项
使用委托调用来设置信息。声明一个协议以将信息传递到详细视图并使其正确显示。Here是一个更详细地描述这一点的教程。
第二个选项
向 DetailViewController 传递一些数据并覆盖 setter 以刷新明细视图。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]];
}
}
Edit: 又看了一遍模板,setDetailItem
类型代码已经在那里,但代码正在创建一个全新的详细视图,因此在 splitViewController 上可查看的详细视图根本不会更改。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)