我在XCode 4.3和IOS 5上设置了一个项目,没有使用iPhone和iPad的故事板,使用创建新项目对话框中的默认主/细节设置。
iPhone方面工作得很好。我在tableView和detailViewController屏幕中选择一个选项,并根据选择更新新信息。
我对didSelectRowAtIndexPath的实现是:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
Shapes *currentShape = [self.shapesArray objectAtIndex:indexPath.row];
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
if (!self.detailViewController) {
self.detailViewController = [[[GeoDetailViewController alloc] initWithNibName:@"GeoDetailViewController_iPhone" bundle:nil] autorelease];
}
[self.navigationController pushViewController:self.detailViewController animated:YES];
[self.detailViewController populateDisplay:currentShape];
} else {
[self.detailViewController populateDisplay:currentShape];
}
}
但是,当我在iPad上运行时,self.detailViewController不存在。所以显示不会更新。我仍然可以在iPad屏幕上看到它,我只是无法改变它。如何在代码中引用它以便我可以更改显示的内容?
答案 0 :(得分:1)
如果你有一个指向拆分视图控制器本身的指针,你可以这样做:
[(GeoDetailViewController *)[[(UINavigationController *)[[splitViewController viewControllers] objectAtIndex:1] viewControllers] objectAtIndex:0] populateDisplay:currentShape];
要获得指向拆分视图的指针,您可能需要通过您的应用代理:
UISplitViewController *splitViewController = [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] splitViewController];
(假设您使用默认的拆分视图控制器模板 - YMMV取决于您实现它的方式)
请注意,在您创建拆分视图时,必须将详细信息视图控制器设置为GeoDetailViewController
- 如果您不是,并且由于应用程序设计原因,您无法编辑,我可以编辑我的答案是解决这个问题。
答案 1 :(得分:1)
我对Master / Detail视图的模板实现感到困惑。我问了一个类似的问题:
How to update DetailView using MasterDetail Application Template
您可以使用为DetailViewController类默认设置的detailItem(id - 因此您可以传入引用)属性。
答案 2 :(得分:1)
在主/明细模板中,Apple在MasterViewController中使用以下代码(即左侧的代码):
- (void)viewDidLoad {
[super viewDidLoad];
self.detailViewController = (MYDetailViewController *)[[self.splitViewController.viewControllers lastObject] topViewController];
}
将MasterViewController上的属性定义为:
@property (strong, nonatomic) MYDetailViewController *detailViewController;