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

时间:2012-02-03 19:21:56

标签: ios ipad uitableview uisplitviewcontroller

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

3 个答案:

答案 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;