没有 Storyboard 或 XIB 的 UIViewControllers 之间的 Segue
Posted
技术标签:
【中文标题】没有 Storyboard 或 XIB 的 UIViewControllers 之间的 Segue【英文标题】:Segue between UIViewControllers without Storyboard OR XIB 【发布时间】:2015-05-11 22:54:05 【问题描述】:我从 GitHub (here) 下载了一个漂亮的项目,我正在玩它。该项目没有任何故事板或 xib,只有一个 viewController,它仅由一个 viewController.h 文件和一个 viewController.m 文件定义。
也许是一个菜鸟问题,但我可以在不使用任何 xib 或情节提要的情况下以编程方式让 viewController1.h/m 转到 viewController2.h/m 吗?我在 SO 和其他地方发现了很多代码,允许人们以编程方式在 Storyboard 中从一个视图到另一个视图,从一个 xib 到另一个或从记分板到 xib(尽管不是相反),但没有关于如何从一个完全基于代码的 vc 到另一个。我找到的所有代码都要求您根据情节提要或 xib 文件的捆绑位置定义视图,但我不想使用任何一个。
注意:我接受了我所做的答案,因为它的独创性/有趣性,但为了简单起见,我个人最终选择了对同一问题的这个答案(我的答案似乎是重复的):ios: present view controller programmaticallly
【问题讨论】:
"但是我可以让 viewController1.h/m 在不使用任何 xib 或情节提要的情况下以编程方式转到 viewController2.h/m" - 这没有任何意义。转场是故事板的生物,没有故事板就不可能有转场。您可以在代码中从一个控制器移动到另一个控制器,但这不是 segue。 @rdelmar 好吧,当我说“segue”时,我显然使用了错误的术语。我只是说我想以编程方式创建视图,然后以编程方式切换视图。这就是我的问题的本质。 【参考方案1】:您可以使用[viewController presentViewController:anotherController animated:YES completion:nil];
以模态方式呈现视图控制器。
另一种选择是使用UINavigationController
并执行[viewController.navigationController pushViewController:anotherController animated:YES];
仅当viewController
在navigationController
的堆栈中时,第二种方法才有效
【讨论】:
好的,我研究了这个,我的印象是我仍然需要一个故事板,只是没有转场。我可以在没有任何情节提要的情况下完成吗? (我的印象是我需要一个故事板):***.com/questions/10522957/… @MaxvonHippel 只要你有一个视图控制器的引用(不管你如何创建它,无论是从故事板还是通过“手动”实例化视图控制器),你就可以呈现他们。所以,是的,你可以在没有 Storyboard 的情况下做到这一点,而且它比你接受的答案要简单得多。 你是对的,我尝试了你的答案并且很容易让它工作。谢谢。一开始我不理解你非常简单的答案,我觉得有点愚蠢,但我想这正是 SO 的用途:) (澄清一下,由于我犯了一个错误,您的代码起初对我不起作用 - 我删除了一个 xib 文件并且没有 product->clean 所以它一直在寻找视图时崩溃我认为你的代码是负责任的)【参考方案2】:这是我的 Context 类,它改变了视图控制器。它适用于您自己的视图类或情节提要视图类。
具体到您的问题,请查看 open 函数。如果调用 open 时没有根控制器,我将其指定为根视图控制器。否则我会从根视图控制器呈现它。
import Foundation
import UIKit
private let _StoryBoard = UIStoryboard(name: "Main", bundle: nil)
private let _RootWindow = UIWindow(frame: UIScreen.mainScreen().bounds)
public var ROOT_VIEW_CONTROLLER:UIViewController = C_RootViewController()
//abstract base of context classes
class Context:NSObject
class var STORYBOARD:UIStoryboard
return _StoryBoard
class var ROOTWINDOW:UIWindow
return _RootWindow
var _currentController:Controller!
class func reassignRootViewController(controller:UIViewController)
Context.ROOTWINDOW.rootViewController = controller
ROOT_VIEW_CONTROLLER = controller
func initController(controllerName:String)->Controller
return Context.STORYBOARD.instantiateViewControllerWithIdentifier(controllerName) as Controller
func initControllerFromStoryboard(storyboardName:String,controllerName:String)->Controller
var storyboard:UIStoryboard = UIStoryboard(name: storyboardName, bundle: nil)
return storyboard.instantiateViewControllerWithIdentifier(controllerName) as Controller
func open(controller:UIViewController)
if(Context.ROOTWINDOW.rootViewController == nil)
Context.ROOTWINDOW.rootViewController = ROOT_VIEW_CONTROLLER
Context.ROOTWINDOW.makeKeyAndVisible()
ROOT_VIEW_CONTROLLER.presentViewController(controller, animated: true, completion: )
func close(controller:UIViewController)
ROOT_VIEW_CONTROLLER.dismissViewControllerAnimated(true, completion: nil)
【讨论】:
您的答案似乎依赖于捆绑包中存在的情节提要,但我的问题是我是否可以以编程方式切换视图并且没有任何情节提要,无论是否为空。不过谢谢! 正如我所说,这可以处理故事板和非故事板。再读一遍。我的项目不再使用 Xibs 或 Storyboards。如果您不知道如何实例化 ViewController,那就是另一个问题了。 好的,我现在明白了。我对你的代码中的“故事板”这个词太感兴趣了。我重新阅读了代码,现在对我来说很有意义。谢谢!以上是关于没有 Storyboard 或 XIB 的 UIViewControllers 之间的 Segue的主要内容,如果未能解决你的问题,请参考以下文章
如何通过编码管理 .storyboard 或 .xib 文件中的多个视图。?
在xib或storyboard中textView或label的换行
在xib或storyboard中textView或label的换行
如何使本地化的 Storyboard 或 XIB 保持同步?