Ios 将其他UIViewController推送到UINavigationController上的最佳方法

Ios 将其他UIViewController推送到UINavigationController上的最佳方法,ios,objective-c,cocoa-touch,cocoa,Ios,Objective C,Cocoa Touch,Cocoa,我正在使用Xcode附带的、在中引用的主细节项目模板 问题:我正在试图找出如何向此模板附带的默认UINavigationController添加额外的UIViewController 具体来说,我想在DetailViewController之后添加一个DetailEditViewController。以下是我迄今为止为此所做的工作: 在DetailViewController中,我在navigationItem中添加了一个编辑按钮: - (void)viewDidLoad { [supe

我正在使用Xcode附带的、在中引用的主细节项目模板

问题:我正在试图找出如何向此模板附带的默认
UINavigationController
添加额外的
UIViewController

具体来说,我想在
DetailViewController
之后添加一个
DetailEditViewController
。以下是我迄今为止为此所做的工作:

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];
}
我在故事板上创建了一个
DetailEditViewController
,代码运行时不会崩溃,生成了一个黑色的空白窗口,其中有一个导航项,可以让我回到细节。从现在起,我很困惑:

  • 当我将新的视图控制器拖动到情节提要时,不会创建相应的代码文件!我是否负责为这些控制器制作代码文件?我看到序列图像板视图控制器与Identity Inspector中的类关联。。。但当我把一个新的
    UIViewController
    拖到情节提要上时,它究竟为什么不为它创建模板呢
  • 我是否应该使用seque而不是
    -pushViewController
    DetailViewController
    获取
    DetailEditViewController
    ?如果是这样的话,我不知道如何在故事板上添加一个,因为
    navigationItem
    UIBarButtonItem
    都是在代码中添加的。没有任何东西可以拖动
  • 如何将信息从
    DetailViewController
    发送到
    DetailEditViewController
    ?当
    MasterViewController
    转到
    DetailViewController
    时,它通过
    -prepareforsgue:sender:

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

[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];
    }
}

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

当您显示的新视图控制器用于“编辑模式”。这个答案同样适用——只需将IB中的segue类型设置为“model”,而不是“push”“代码保持不变。非常感谢rdelmar和rickster。非常感谢你花时间阅读和回复。rdelmar:以下几点:出于某种原因,我将序列从“局部视图”控制器拖动到“编辑局部视图”控制器的能力不稳定。昨天我可以创建一个segue,但后来我删除了该segue,现在我无法通过Ctrl拖动再次创建segue。你知道为什么吗?另外,您知道如何使新的视图控制器具有导航项栏吗?我把一个拖到视图控制器上,它显示在左边的层次结构中,但不在场景中。好吧,我通过缩小来重新创建序列。出于某种原因,缩小屏幕似乎效果更好。IRC folk还建议,如果Ctrl拖动序列不起作用,可以Ctrl单击并使用小圆圈,将在此处添加一个新问题,因此关于我上面的另一个问题哈哈,很抱歉这里出现洪水。看起来,当我添加序列时,它将原始关系从导航控制器一直扩展到我的新场景!非常好,谢谢