11

我是使用拆分视图创建 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 上的标签文本。但是,当我单击主视图控制器表中的项目时,什么也没有发生。

4

1 回答 1

8

有几种不同的方法可以做到这一点。首先,就像您说的那样,删除pushViewController呼叫(我不知道为什么 Apple 的模板会这样做......也许只是为了向您展示您可以?)。

接下来,让您的 MasterViewController 了解已显示的 DetailViewController。我通常设置master.detailViewController = detailViewControllerappDelegate.

请记住,DetailViewController 已经显示出来了,因此您并不总是需要重新分配它(除非您将其替换为其他视图)

第一个选项

使用委托调用来设置信息。声明一个协议以将信息传递给 detailView 并让它适当地显示它。是一个更详细地描述这一点的教程。

第二种选择

传递 DetailViewController 一些数据并覆盖 setter 以刷新 detailView。是一个更详细地描述这一点的教程。

// 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 根本没有改变。

于 2011-10-28T19:10:44.063 回答