如何在使用splitViewController的iPad上引用detailViewController

我在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屏幕上看到它,我无法改变任何内容。 如何在代码中引用它以便我可以更改显示的内容?

我对Master / Detail视图的模板实现感到困惑。 我问了一个类似的问题:

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

您可以使用detailItem(id – 因此您可以传入引用)属性,该属性默认为DetailViewController类设置。

如果您有一个指向拆分视图控制器本身的指针,您可以执行以下操作:

 [(GeoDetailViewController *)[[(UINavigationController *)[[splitViewController viewControllers] objectAtIndex:1] viewControllers] objectAtIndex:0] populateDisplay:currentShape]; 

要获得指向拆分视图的指针,您可能必须通过您的应用程序委托:

 UISplitViewController *splitViewController = [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] splitViewController]; 

(假设您使用默认的拆分视图控制器模板 – YMMV取决于您实现它的方式)

请注意,在创建拆分视图时, 必须将详细视图控制器设置为GeoDetailViewController – 如果您不是,并且由于应用程序设计原因而GeoDetailViewController ,我可以编辑我的答案以解决此问题。

在主/详细模板中,Apple在MasterViewController中使用以下代码(即左侧的代码):

 - (void)viewDidLoad { [super viewDidLoad]; self.detailViewController = (MYDetailViewController *)[[self.splitViewController.viewControllers lastObject] topViewController]; } 

将MasterViewController上的属性定义为:

 @property (strong, nonatomic) MYDetailViewController *detailViewController;