SWIFT uiviewcontroller 初始化

Posted

技术标签:

【中文标题】SWIFT uiviewcontroller 初始化【英文标题】:SWIFT uiviewcontroller init 【发布时间】:2014-11-02 18:43:55 【问题描述】:

我开始使用 Swift

当我可以避免使用故事板时,使用 Objective-C,初始化视图控制器很容易。我只需创建一个UIViewController 子类,然后将所有初始化代码放入其中 initWithNibName.

现在有了故事板,我迷路了。我创建了一个UIviewController 子类,我尝试添加init(nib name) 和init(coder) 但它崩溃了。

这是我的代码:

   //
    //  SecondViewController.swift
    //  tabTestWithSwift
    //
    //  Created by Marianna Ruggieri  on 02/11/14.
    //  Copyright (c) 2014 Marianna Ruggieri. All rights reserved.
    //

    import UIKit

class FirstViewController: UIViewController 

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    

    override func didReceiveMemoryWarning() 
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) 
        println("init with nib")
        super.init()
        tabBarItem.title = "test"
    

    required init(coder aDecoder: NSCoder) 
        //fatalError("init(coder:) has not been implemented")
        print("init coder")
        super.init()
    


看这个截图: http://oi62.tinypic.com/10ogwsh.jpg

编辑:我没有做任何特别的事情。启动了一个TabBar 项目并编辑了视图控制器,如您在上面的代码中所见。就是这样!!!!

如果我使用情节提要,初始化UIViewController 的正确方法是什么?我应该将视图控制器的所有设置放在哪里?对于某些设置,加载为时已晚。

【问题讨论】:

它在哪里崩溃?有异常消息吗?到目前为止,您对debug 有什么尝试? 你是如何尝试实例化这个视图控制器的?在转场?在代码中? (lldb) 我不擅长调试器,但我认为它会在 nib 的初始化时崩溃。我启动了 Xcode 6.1 并打开了一个新项目 TabBarController,在故事板中我有我的 2 个视图控制器......这是第二个的代码......这就是我所做的一切 1.你的init 方法在这里不是必需的,除非你在那里做任何材料,你不是(title 的设置可以移动到viewDidLoad)。 2. 问题不在于上面的代码,而在于你如何实例化这个视图控制器。向我们展示创建/使用此视图控制器的代码和/或告诉我们您是如何配置故事板的。当您说“它崩溃了”时,这并不能提供太多信息:您必须告诉我们完整的错误消息是什么! 这是我的错误屏幕i61.tinypic.com/2vmzdco.png 【参考方案1】:

您正在通过调用super.init() 创建一个循环,而您应该调用init(nibName:nibBundleOrNil)init() 的 super 实现调用你的方法,然后又调用 super init。

【讨论】:

成功了!!!!你能更好地解释一下为什么吗?我试图将 super.init(coder:aDecoder) 也放入 init(coder) 中,但它从未调用过 nib init ......我迷路了,因为 Xcode 总是希望我使用 init(coder) 一般来说,当你重写一个函数时,对 super 的调用应该使用相同的签名(如果你不这样做,笔尖名称和包名称将丢失)。调用哪个初始化程序取决于您如何实例化您的类或 nib

以上是关于SWIFT uiviewcontroller 初始化的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 3 中覆盖 UIViewController 初始化

是否可以根据从 Swift 中的 UIViewController 继承的类中的另一个来初始化变量?

UIViewController-Swift

UIViewController 和所需的初始化?(编码器:)

类没有初始化器:Swift 错误

Swift 错误:类 RecordSoundsViewController 没有初始化器