没有故事板或XIB的UIViewControllers之间的争论

时间:2015-05-11 22:54:05

标签: objective-c xcode uiviewcontroller segue

我有一个从GitHub(here)下载的漂亮项目,我正在玩它。该项目没有任何storyboard或xibs,只有一个viewController,它只使用viewController.h文件和viewController.m文件定义。

也许是一个菜鸟问题,但我能不能使用任何xib或故事板以编程方式将viewController1.h / m转换为viewController2.h / m?我在SO和其他地方发现了很多代码,允许一个人在一个故事板中以编程方式从一个视图到另一个视图,从一个xib到另一个或从记分板到xib(虽然不是相反),但没有关于如何从一个完全基于代码的vc到另一个。我发现的所有代码都要求您根据storyboard或xib文件的bundle位置定义视图,但我不想使用它们。

注意:我接受了我所做的答案,因为它的独创性/有趣性,但为了简单起见,我个人最终选择了同一个问题的答案(我看来是重复的):{{3 }}

2 个答案:

答案 0 :(得分:2)

您可以使用[viewController presentViewController:anotherController animated:YES completion:nil];以模态方式显示视图控制器。

另一种方法是使用UINavigationController并执行[viewController.navigationController pushViewController:anotherController animated:YES];

仅当viewController位于navigationController

的堆叠中时,第二种方法才有效

答案 1 :(得分:1)

这是我的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)
    }
}