我对iOS编程很陌生,我正在尝试做一些我认为很简单的事情,但我找不到明确的解释。 我正在尝试使用Xcode 6.3和swift 1.2开发应用程序
我有这个:
所以我在基于标签的应用程序中。每个选项卡视图都在导航控制器内。 D 是 C 的模式发布。当我点击 D 内的按钮时,我想转到 B 。这可以。但我还想显示顶部导航栏,后面的按钮指向 A 。 目前,当我尝试使用从 D 到 B 的推送segue时, B 显示为模态,但不是导航控制器的一部分。< / p>
我如何轻松实现这一目标?我是否必须通过实例化每个视图(A然后是B)并将所有内容推送到导航堆栈来重新创建所有堆栈?
如果您知道在objective-c中实现此目的的代码,那对我来说也没问题。
答案 0 :(得分:2)
当我点击 D 内的按钮时,我想转到 B 。这可以。但我还想显示顶部导航栏,后面的按钮指向 A 。
如果实际位于导航堆栈,您只能返回 A 。因此,在实现目标之前,您必须以某种方式将其推入堆栈。
作为一般提示,如果您希望视图控制器显示导航栏,您只需确保它已嵌入到导航控制器中。当您以模态方式呈现视图时,默认情况下不会将其嵌入到导航控制器中。所以,正如你所说 D 从 C 以模态方式显示,只需将 D 嵌入到另一个导航控制器中,而不是使 D 模态segue的目的地,使导航控制器成为目的地。
<强>更新强>
如果您想在 B 中显示指向 A 的后退按钮,即使 B 从<强> D ,你将不得不破解,因为 A 不在导航堆栈上。因此,从逻辑上讲,您要做的就是确保在 B 之前 A 位于导航堆栈上。我不认为你可以使用IB中的segue来做到这一点,而是使用代码并自己实例化UINavigationController
:
- (void)showBModallyWithBackButtonToA
{
A *a = [[A alloc] init];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:a];
B *b = [[B alloc] init];
[nav pushViewController:b animated:NO];
[self presentViewController:nav animated:YES completion:nil];
}
如果我理解您的设置正确,则必须从 D 执行此代码。
答案 1 :(得分:1)
以下是nburk使用故事板转换为swift的解决方案:
let a = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("aIdentifier") as! ATableViewController
let nav = UINavigationController(rootViewController: a)
let b = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("bIdentifier") as! BViewController
// b parameters here
// b.parameter1 = variable
nav.pushViewController(b, animated:false)
self.presentViewController(nav, animated:true, completion:nil)
其中aIdentifier和bIdentifier是您在每个视图的Storyboard编辑器中设置的标识符,ATableViewController和BViewController是它们各自的ViewController类。