SWIFT UIViewController初始化

3

我开始使用Swift

在使用 Objective-C 且不使用storyboard的情况下,初始化视图控制器很容易。只需要创建一个UIViewController子类,然后将所有初始化代码放在initWithNibName中即可。

现在有了storyboard,我有些迷茫。我创建了一个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项目,并像您在上面的代码中看到的那样编辑了视图控制器。就是这样!!
如果我使用Storyboard,初始化UIViewController的正确方法是什么?我应该在哪里放置所有视图控制器的设置?对于某些设置,负载太晚了。

4
它在哪里崩溃?有异常信息吗?你已经尝试过什么来调试吗? - i_am_jorf
(lldb) 我不太擅长调试器,但我认为它在 nib 的初始化时崩溃了。我启动了 Xcode 6.1 并打开了一个新项目 TabBarController,在 storyboard 中有我的两个视图控制器...这是第二个视图控制器的代码...这就是我所做的全部。 - Marianna
  1. 这里不需要你的 init 方法,除非你在那里做了一些实质性的操作,而你并没有(而且设置 title 的部分可以移到 viewDidLoad)。
  2. 毫无疑问,问题并不在上述代码中,而是在于你如何初始化这个视图控制器。给我们展示一下创建/使用该视图控制器的代码,或者告诉我们你是如何配置故事板的。当你说“它崩溃了”的时候,这并没有提供足够的信息:你必须告诉我们完整的错误消息是什么!
- Rob
这是你的控制台输出,而不是崩溃日志。 - Abizern
我不知道为什么仅仅因为一个简单的问题我就被扣了-3分。计算机科学是建立在分享和帮助人们学习的精神基础上的。但在这里,似乎充满了自负的老师们,他们只是互相挑战来让自己感觉更好。所以我在这里请求帮助,却只得到了-3分而没有解决我的问题。 - Marianna
显示剩余3条评论
1个回答

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

它成功了!!!你能更好地解释一下为什么吗?我试图在init(coder)中也放置super.init(coder:aDecoder),但它从未调用nib init...我迷失了,因为Xcode总是要求我使用init(coder)。 - Marianna
通常情况下,当你重写一个函数时,调用super应该使用相同的签名(如果不这样做,nib名称和bundle名称将会丢失)。哪个初始化程序被调用取决于你如何实例化你的类或nib。 - Bob Vork

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接