Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在swift中对UIViewController进行子类化并添加属性?_Ios_Swift_Properties_Uiviewcontroller_Initialization - Fatal编程技术网

Ios 如何在swift中对UIViewController进行子类化并添加属性?

Ios 如何在swift中对UIViewController进行子类化并添加属性?,ios,swift,properties,uiviewcontroller,initialization,Ios,Swift,Properties,Uiviewcontroller,Initialization,我想在Swift中创建一种新的视图控制器,它有一个必须显式初始化的附加属性。此属性为nil或具有默认值没有任何意义,控制器将仅以编程方式初始化。我试着这样定义它: class MyController : UIViewController { var prop: Int init(prop: Int) { self.prop = prop super.init() } required init(coder aDecoder: NSCoder?) { f

我想在Swift中创建一种新的视图控制器,它有一个必须显式初始化的附加属性。此属性为nil或具有默认值没有任何意义,控制器将仅以编程方式初始化。我试着这样定义它:

class MyController : UIViewController {
  var prop: Int
  init(prop: Int) {
    self.prop = prop
    super.init()
  }

  required init(coder aDecoder: NSCoder?) {
    fatalError("don't serialize this")
  }
}
我试着运行它,但它崩溃了,因为super.init试图运行未定义的nib构造函数,所以我尝试添加:

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
  super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
但是现在编译器抱怨说prop没有被初始化。这是我的问题:我如何在这里正确初始化道具?我不想要默认值,我设置的任何内容都将覆盖我在另一个初始值设定项中设置的正确值

我在nib init中设置了一些默认值,然后让我的第一个init来做这件事

self.prop = prop
super.init()
self.prop = prop
但除了非常奇怪和丑陋之外,这让我担心现在有可能从nib初始化我的视图控制器,并以默认值结束,这将是不好的

在Swift中,正确的惯用方法是什么?

试试下面的方法

class MyController: UIViewController {

    var prop: Int

    required init?(coder aDecoder: NSCoder) {
        fatalError()
    }

    init(prop: Int) {
        self.prop = prop
        super.init(nibName: nil, bundle: nil)
    }
}
试试下面的方法

class MyController: UIViewController {

    var prop: Int

    required init?(coder aDecoder: NSCoder) {
        fatalError()
    }

    init(prop: Int) {
        self.prop = prop
        super.init(nibName: nil, bundle: nil)
    }
}

在某些情况下,必须通过调用initnibName:bundle:或initcoder:初始化视图控制器

试试这个:

class MyViewController: UIViewController {

    var prop: Int

    init(prop: Int, nibName nibNameOrNil: String? = nil, bundle nibBundleOrNil: Bundle? = nil) {
        self.prop = prop
        super.init(nibName:nibNameOrNil, bundle: nibBundleOrNil)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}

在某些情况下,必须通过调用initnibName:bundle:或initcoder:初始化视图控制器

试试这个:

class MyViewController: UIViewController {

    var prop: Int

    init(prop: Int, nibName nibNameOrNil: String? = nil, bundle nibBundleOrNil: Bundle? = nil) {
        self.prop = prop
        super.init(nibName:nibNameOrNil, bundle: nibBundleOrNil)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}


如何创建视图控制器?故事板?编程?@picciano Programmatically您考虑过协议而不是继承吗?它更简洁,似乎是当前向现有类添加属性的惯例。或者,视图控制器是否可以拉入所需的数据,而不是在init函数中进行设置?初始化器适用于以编程方式创建的视图控制器,但是对于通过故事板创建的视图控制器,如何创建视图控制器?故事板?编程?@picciano Programmatically您考虑过协议而不是继承吗?它更简洁,似乎是当前向现有类添加属性的惯例。或者,视图控制器是否可以拉入所需的数据,而不是在init函数中进行设置?初始化器适用于以编程方式创建的视图控制器,但对于通过故事板创建的ViewController,使用Swift 4不适用于我,UIViewController没有initframe:并且必须调用指定的init方法。我认为您正在考虑UIViewFrame,但我需要定义initframe:?使用Swift 4对我不起作用,UIViewController没有initframe:,必须调用指定的init方法。我认为您正在考虑UIViewController,但我需要定义initframe:?废话,问题是我的视图控制器没有直接将UIViewController子类化,需要运行一个中间层。起初我把它排除在外,因为我认为它不重要……那时可能也需要看到这一点。您应该能够用您的子类替换UIViewController,但通常我不鼓励使用子类来支持协议。您希望通过基本视图控制器实现的大多数功能实际上都可以通过协议实现。但这可能是另一个要发布的问题…事实上,这确实帮助我弄明白了!问题是超类调用的是[super init],而不是[super initWithNibName:nil bundle:nil]。第一种方法只是第二种方法的一个方便方法,但由于多态性,它最终在MyViewController中调用了nib init,这是我不想要的!将其更改为显式的第二种形式可以确保不会发生这种情况。我想我在我的问题中通过调用super.init证明了这一点,同样的问题。糟糕,问题是我的视图控制器没有直接将UIViewController子类化,需要运行一个中间层。起初我把它排除在外,因为我认为它不重要……那时可能也需要看到这一点。您应该能够用您的子类替换UIViewController,但通常我不鼓励使用子类来支持协议。您希望通过基本视图控制器实现的大多数功能实际上都可以通过协议实现。但这可能是另一个要发布的问题…事实上,这确实帮助我弄明白了!问题是超类调用的是[super init],而不是[super initWithNibName:nil bundle:nil]。第一种方法只是第二种方法的一个方便方法,但由于多态性,它最终在MyViewController中调用了nib init,这是我不想要的!将其更改为显式的第二种形式可以确保不会发生这种情况。我想我在我的问题中通过调用super.init证明了这一点,同样的问题。