1

我正在使用 Xcode 附带并在http://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/SecondiOSAppTutorial/中引用的 Master-Detail 项目模板

问题:我试图弄清楚如何在这个模板附带UIViewController的默认值中添加额外的 s 。UINavigationController

具体来说,我想添加一个DetailEditViewControllerafter DetailViewController。到目前为止,这是我为此所做的工作:

DetailViewController我添加了一个编辑按钮到navigationItem

- (void)viewDidLoad
{
    [super viewDidLoad];       
    self.navigationItem.rightBarButtonItem = 
        [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit
                                                      target:self 
                                                      action:@selector(editDetailItem:)];
    [self configureView];
}

您可以看到它指定了一个消息选择器editDetailItem:,我将其实现为:

- (void)editDetailItem:(id)sender
{
    [self.navigationController pushViewController:
        [[DetailEditViewController alloc] init] animated:YES];
}

我在DetailEditViewControllerStoryboard 上创建了一个,代码运行时不会崩溃,生成一个带有导航项的黑色空白窗口,让我回到细节。从这里开始,我很困惑:

  • 当我将一个新的 View Controller 拖到 Storyboard 时,没有创建相应的代码文件!我是否负责为这些控制器制作代码文件?我看到 Storyboard View Controllers 与 Identity Inspector 中的一个类相关联......但是UIViewController当我将一个新的模板拖到 Storyboard 上时,为什么它不会为新的模板创建模板呢?
  • 我应该使用序列而不是从到-pushViewController获取吗?如果是这样,我不确定如何在情节提要上添加一个,因为s都是在代码中添加的。没有什么可以 Ctrl 拖动的。DetailViewControllerDetailEditViewControllernavigationItemUIBarButtonItem
  • 我如何将信息从 发送DetailViewControllerDetailEditViewController?当MasterViewControllersegues to 时DetailViewController,它指定sendervia- prepareForSegue:sender:
4

1 回答 1

2

你是对的,没有产生相应的文件。系统应该如何知道你想要什么类?您需要创建一个 UIViewController 子类,并将您拖入的控制器的类更改为该类。推送新控制器的最简单方法是使用推送转场——如果情节提要中没有 UI 元素来连接它,则直接从控制器连接它并给转场一个标识符(我称之为在我的示例中为“GoToEdit”)。在编辑按钮的操作方法中,然后执行 segue:

[self performSegueWithIdentifier:@"GoToEdit" sender:self];

如果你想传递信息,那么你实现 prepareForSegue:,如下所示:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"GoToEdit"]) {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        NSDate *object = _objects[indexPath.row];
        [[segue destinationViewController] setDetailItem:object];
    }
}

首先检查 segue 标识符是一件好事。然后您可以访问您的destinationViewController(您可能必须将其强制转换为您的类,以便编译器识别您尝试设置的任何属性),并将您想要的内容传递给它。

于 2013-02-14T19:16:37.753 回答