创建一个可以模态显示或推送到导航堆栈的 UIView

Posted

技术标签:

【中文标题】创建一个可以模态显示或推送到导航堆栈的 UIView【英文标题】:Create a UIView that can be presented modally OR pushed onto the navigation stack 【发布时间】:2012-05-23 16:54:39 【问题描述】:

我有一个项目详细信息视图,我想将其用于两个目的:

1) 创建一个新项目 2) 编辑现有项目

编辑时,视图将被推送到导航堆栈,从其父级获取导航栏。

在创建项目时,我想以模态方式呈现视图,但顶部仍有一个导航栏,带有“完成”和“取消”按钮。

我不希望看到有两个导航栏的视图,或者没有。

我将如何实现这个?

【问题讨论】:

【参考方案1】:

为了做到这一点,我:

从我的视图中删除了导航栏。 以模态方式启动时,首先创建一个导航控制器,然后以我的视图作为根视图以模态方式显示导航控制器(即使我不打算将其他任何东西推入堆栈)。所以改变了这个:

StoreDetailView *storeDetailView = [[StoreDetailView alloc] initWithNibName:@"StoreDetailView" bundle:nil];
// ... configure the view, including setting delegate...
[self presentViewController:storeDetailView animated:YES completion: nil];

到这里:

StoreDetailView *storeDetailView = [[StoreDetailView alloc] initWithNibName:@"StoreDetailView" bundle:nil];
// ... configure the view, including setting delegate...
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:storeDetailView];
[self presentViewController:navController animated:YES completion: nil];

然后在 StoreDetailView 中,根据是否设置了委托来确定导航栏的外观:

if (self.delegate == nil) 
    self.navigationItem.rightBarButtonItem = [self editButtonItem];
 else 
    [self setEditing:TRUE];
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(done:)];
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancel:)];

【讨论】:

以上是关于创建一个可以模态显示或推送到导航堆栈的 UIView的主要内容,如果未能解决你的问题,请参考以下文章

将 MFMailComposeViewController 推送到导航堆栈上?未以模态方式呈现

在 UIButton 单击时以编程方式创建 Segue 或推送到另一个视图控制器

将 UIViewController 推送到导航堆栈时如何显示选项卡栏

ios:如何关闭模态视图控制器,然后弹出推送的视图控制器

无法将现有项目克隆或推送到gitlab

在导航堆栈中以模态方式呈现视图控制器