在 Swift 中以编程方式设置根视图控制器

Posted

技术标签:

【中文标题】在 Swift 中以编程方式设置根视图控制器【英文标题】:Programmatically Setting Root View Controller in Swift 【发布时间】:2014-10-22 18:00:52 【问题描述】:

我不知道为什么这么简单,但我的 Swift 翻译速度很慢。无论如何,我无法弄清楚它在抱怨什么。我要做的就是设置根视图控制器,编译器会吐出一条错误消息:

"Splash pageController 没有名为 init 的成员"

这是我的应用委托:

var window: UIWindow?

var CLIENT_KEY = c_key()

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 
    // Override point for customization after application launch.

    window = UIWindow(frame: UIScreen.mainScreen().bounds)

    var url_string = "XXXX=\(CLIENT_KEY.client_key)"

    var g_home_url = String.stringWithContentsOfURL(NSURL.URLWithString(url_string), encoding: NSUTF8StringEncoding, error: nil)

    if (g_home_url? != nil)

        NSUserDefaults.standardUserDefaults().setObject(g_home_url, forKey: "showUrl")

    

    let DocumentsDirectory = NSSearchPathDirectory.DocumentationDirectory

    let UserDomainMask = NSSearchPathDomainMask.UserDomainMask

    if let paths = NSSearchPathForDirectoriesInDomains(DocumentsDirectory, UserDomainMask, true)
        if paths.count > 0
            if let dirPath = paths[0] as? String 

               // let url: NSURL = NSURL.URLWithString("\(g_home_url)/XXX\(CLIENT_KEY.client_key)")

              //  println(url)
                var err: NSError?

                var g_home_url = NSUserDefaults.standardUserDefaults().objectForKey("showUrl") as String

                println(g_home_url)
                var image = UIImage(data: NSData(contentsOfURL: NSURL.URLWithString("\(g_home_url)XXX=\(CLIENT_KEY.client_key)")))

                let writePath = dirPath.stringByAppendingPathComponent("splash_page.png")
                UIImagePNGRepresentation(image)
            
        
    
//This is where the error shows up
    var rootview: SplashViewController = SplashViewController()
    if let window = window 

        window.rootViewController = rootview;
    

SplashViewController

class SplashViewController: UIViewController 


我知道的很基本。通常,在 Objective-C 中,我会初始化一个 nib 名称并将视图控制器设置为该名称。 Swift 的主要区别是什么?

【问题讨论】:

【参考方案1】:

这一行:

var rootview: SplashViewController = SplashViewController()

...调用 SplashViewController 的 init 方法。但是你没有给 SplashViewController 任何init 方法。给它一个。

我通常会在 init 覆盖中指定笔尖;例如:

override init() 
    super.init(nibName:"SplashViewController", bundle:nil)

如果您不按照这些思路进行某事,则视图控制器将找不到它的 nib,您最终会出现黑屏。

请注意,该代码很可能会给您带来一条新的错误消息,抱怨您没有实现init(coder:);所以你必须实现它,即使只是在被意外调用时抛出错误:

required init(coder: NSCoder) 
    fatalError("NSCoding not supported")

【讨论】:

以上是关于在 Swift 中以编程方式设置根视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 Swift 中以编程方式设置 rightBarButton

在 Swift 中以编程方式将视图添加到 stackview

在Swift 3中以编程方式创建一个没有XIB的NSViewController

如何在 ios swift 中以编程方式将情节提要视图控制器加载到标签栏控制器中?

如何在 Objective-C 控制器中以编程方式加载用 swift 编写的自定义 XIB 视图

当 iAd 横幅出现时,如何将视图的内容上移? (在 Swift 中以编程方式)