ios - 将其他 ViewController 推送到 UINavigationController 的最佳方法

标签 ios objective-c cocoa-touch cocoa

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

问题:我正在尝试弄清楚如何向此模板附带的默认 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];
}

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

  • 当我将一个新的 View Controller 拖到 Storyboard 中时,没有创建相应的代码文件!我是否负责为这些 Controller 制作代码文件?我看到 Storyboard View Controllers 与 Identity Inspector 中的一个类相关联......但是当我将一个拖到 Storyboard 上时,为什么它不会为新的 UIViewController 创建模板?
  • 我应该使用 seque 而不是 -pushViewController 来从 DetailViewControllerDetailEditViewController 吗?如果是这样,我不确定如何在 Storyboard 上添加一个,因为 navigationItemUIBarButtonItem 都是在代码中添加的。没有什么可以按住 Ctrl 键拖动。
  • 如何将信息从 DetailViewController 发送到 DetailEditViewController?当 MasterViewController 转至 DetailViewController 时,它通过 - prepareForSegue:sender:
  • 指定 sender

最佳答案

没错,没有生成相应的文件。系统应该如何知道你想要什么类(class)?您需要创建一个 UIViewController 子类,并将您拖入的 Controller 的类更改为该类。推送新 Controller 的最简单方法是使用推送 segue——如果你在 Storyboard中没有 UI 元素来连接它,你直接从 Controller 连接它并给 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(您可能必须将其转换为您的类,以便编译器识别您尝试设置的任何属性),并将您想要的内容传递给它。

关于ios - 将其他 ViewController 推送到 UINavigationController 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14882057/

相关文章:

objective-c - 对于IOS应用,MainView.m中添加了initWithCoder后,View并不会在drawRect之前清空其内容,为什么?

ios - 使用 UI 警报 View 按钮关闭模态视图 Controller

ios - 触发点击 MSSticker 或以编程方式查看?

objective-c - 有没有办法将方法作为 block 传递?

iphone - 字符串中的子串整数

ios - 应用程序崩溃 : Mutating method sent to immutable object

ios - 当我更改 iPhone 的语言时,会导致崩溃吗?

ios - Objective-C:改变自身属性的递归方法

ios - 获取事件 Storyboard

ios - 定时器选择器中具有完成功能的函数