将其他UIViewControllers推送到UINavigationController的最佳方法

时间:2013-02-14 18:57:15

标签: ios objective-c cocoa-touch cocoa

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

问题:我正在尝试弄清楚如何将其他UIViewController添加到此模板附带的默认UINavigationController中。

具体来说,我想在DetailEditViewController之后添加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];
}

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

  • 当我将新的视图控制器拖到故事板时,没有创建相应的代码文件!我负责为这些控制器制作代码文件吗?我看到故事板视图控制器与Identity Inspector中的一个类相关联......但是当我将一个人拖到故事板上时,它为什么不为新的UIViewController创建模板?
  • 我应该使用seque而不是-pushViewControllerDetailViewControllerDetailEditViewController吗?如果是这样,我不确定如何在故事板上添加一个,因为navigationItem的{​​{1}}都是在代码中添加的。无法按Ctrl键拖动。
  • 如何从UIBarButtonItemDetailViewController发送信息?当DetailEditViewController偏离MasterViewController时,它会通过DetailViewController
  • 指定sender

1 个答案:

答案 0 :(得分:2)

你是对的,没有产生相应的文件。系统如何知道你想要什么课程?您需要创建一个UIViewController子类,并将您拖入的控制器的类更改为该类。推送新控制器的最简单方法是使用push segue - 如果故事板中没有用于连接它的UI元素,则直接从控制器连接它并给segue一个标识符(我称之为我的例子中的“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(你可能需要将它强制转换为你的类,因此编译器会识别你想要设置它的任何属性),并传递你想要的东西。