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

标签 objective-c ios xcode uisplitviewcontroller xcode-template

我不熟悉使用 Split View创建 iPad 应用程序。当我第一次使用标准 MasterDetail 应用程序模板 (Xcode 4.2) 创建项目时,它会创建一个 MasterViewController 和一个 DetailViewController。该模板具有以下方法,当从弹出表(主细节 View Controller )中选择一行时调用该方法:

- (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];

现在我明白了,当您使用常规导航 Controller 时,如果您正在为 iPhone 编程,您只需执行此类操作即可将另一个 View Controller 推送到堆栈上。但是,使用此模板,它只是将详细 View 推送到弹出窗口,而不是更新已经存在的内容。我很困惑,因为我需要更新以从弹出窗口(主详细信息 View )中选择某些内容,然后让 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 上的标签文本。但是,当我单击主视图 Controller 表中的项目时,没有任何反应。

最佳答案

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

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

记住,DetailViewController 已经被显示了,所以你不需要总是重新分配它(除非你用其他 View 替换它)

第一个选项

使用委托(delegate)调用来设置信息。声明一个协议(protocol)以将信息传递给 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所以detailView是可见的在 splitViewController 上根本没有改变。

关于objective-c - 如何使用 MasterDetail 应用程序模板更新 DetailView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7931848/

相关文章:

ios - 当使用 UIView.animate 对 View 进行动画处理时,其他 View 也会不必要地进行动画处理

ios - 使用 Xcode 6.3.1 生成 IPA 时出现问题

iphone - AvAudioRecorder 设置配置帮助

ios - 如何查看使用 valueForKey 创建的 NSArray 是否为空

ios - 如何在objective-c中添加和更新二维数组的对象?

ios - 如何在 ios objective c 中以编程方式从 sim 卡获取国家代码

javascript - iOS 项目中缺少的 .a 文件

ios - UITableView 中的单元格重用问题

ios - 将核心数据添加到现有的 iPhone 项目

ios - 字符到 NSString ObjC