如何使用主详细信息应用程序模板更新详图视图

时间:2011-10-28 16:07:07

标签: objective-c ios xcode uisplitviewcontroller xcode-template

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

1 个答案:

答案 0 :(得分:8)

有几种不同的方法可以做到。首先,就像你说的那样,删除pushViewController电话(我不知道为什么Apple的模板会这样做......也许只是为了告诉你可以吗?)。

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

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

第一个选项

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

第二个选项

传递DetailViewController的一些数据&覆盖setter以刷新detailView。 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]];
        }
    }

编辑:再次查看模板,setDetailItem类型代码已经存在,但代码创建了一个全新的detailView,因此可以在splitViewController上查看detailView根本没有改变。