将视图从另一个选项卡的模态推送到导航
Push view to navigation from modal of another tab
我对 iOS 编程还很陌生,我正在尝试做一些我认为很简单但找不到明确解释的事情。
我正在尝试使用 Xcode 6.3 和 swift 1.2
开发应用程序
我有这个:
所以我在基于选项卡的应用程序中。每个选项卡视图都在导航控制器内。
D 是来自 C 的模态启动。当我单击 D 中的按钮时,我想转到 B。这可以。但我还想显示带有指向 A 的后退按钮的顶部导航栏。
现在,当我尝试使用从 D 到 B 的推送转场时,B 显示为模态但不是导航控制器的一部分。
我如何轻松实现这一目标?我是否必须通过实例化每个视图(A 然后 B)来重新创建所有堆栈并将所有内容推送到导航堆栈?
如果您知道 objective-c 中实现此目的的代码,对我来说也很好。
当我点击 D 里面的按钮时,我想去 B。这可以。但我还想显示带有指向 A.
的后退按钮的顶部导航栏
你只能返回到A,如果它确实在导航堆栈.因此,您必须以某种方式将其压入堆栈才能实现您的目标。
作为一般提示,如果您希望视图控制器显示导航栏,您只需确保它嵌入到导航控制器中即可。当您以模态方式呈现视图时,它不会默认嵌入到导航控制器中。因此,正如您所说 D 是从 C 模态显示的,只需将 D 嵌入另一个导航控制器,然后不要将 D 作为模态转场的目的地,而是将导航控制器作为目的地。
更新
如果您想在 B 中显示指向 A 的后退按钮, 即使 B 是从 D 模态显示的,你将不得不绕过,因为 A 是不在导航堆栈上。因此,从逻辑上讲,您必须做的是确保 A 在 B 之前的导航堆栈中。我不认为你可以简单地使用 IB 的 segues 来做到这一点,而是使用代码并自己实例化 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 执行此代码。
这是 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 是您在故事板编辑器中为每个视图设置的标识符,ATableViewController 和 BViewController 它们各自的 ViewController 类.
我对 iOS 编程还很陌生,我正在尝试做一些我认为很简单但找不到明确解释的事情。 我正在尝试使用 Xcode 6.3 和 swift 1.2
开发应用程序我有这个:
所以我在基于选项卡的应用程序中。每个选项卡视图都在导航控制器内。 D 是来自 C 的模态启动。当我单击 D 中的按钮时,我想转到 B。这可以。但我还想显示带有指向 A 的后退按钮的顶部导航栏。 现在,当我尝试使用从 D 到 B 的推送转场时,B 显示为模态但不是导航控制器的一部分。
我如何轻松实现这一目标?我是否必须通过实例化每个视图(A 然后 B)来重新创建所有堆栈并将所有内容推送到导航堆栈?
如果您知道 objective-c 中实现此目的的代码,对我来说也很好。
当我点击 D 里面的按钮时,我想去 B。这可以。但我还想显示带有指向 A.
的后退按钮的顶部导航栏你只能返回到A,如果它确实在导航堆栈.因此,您必须以某种方式将其压入堆栈才能实现您的目标。
作为一般提示,如果您希望视图控制器显示导航栏,您只需确保它嵌入到导航控制器中即可。当您以模态方式呈现视图时,它不会默认嵌入到导航控制器中。因此,正如您所说 D 是从 C 模态显示的,只需将 D 嵌入另一个导航控制器,然后不要将 D 作为模态转场的目的地,而是将导航控制器作为目的地。
更新
如果您想在 B 中显示指向 A 的后退按钮, 即使 B 是从 D 模态显示的,你将不得不绕过,因为 A 是不在导航堆栈上。因此,从逻辑上讲,您必须做的是确保 A 在 B 之前的导航堆栈中。我不认为你可以简单地使用 IB 的 segues 来做到这一点,而是使用代码并自己实例化 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 执行此代码。
这是 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 是您在故事板编辑器中为每个视图设置的标识符,ATableViewController 和 BViewController 它们各自的 ViewController 类.