2014-10-10 17 views
0

这里是我的视图类如何初始化存在于Interface Builder的一个UIView还需要初始化代码

class V_TakePhoto:UIView{ 

    var _takePhotoCallback:(iImage)->Void? 

    required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     _takePhotoCallback = nil 
    } 


    @IBAction func takePhoto(sender: AnyObject) { 

     println("Here we go!") 
    } 


    func initWithCameraCallback((iImage)->Void) 
    { 

    } 

} 

这个类是一个UIView子类。在界面生成器中,我选择了ViewController类,然后选择了它的View对象。我将V_TakePhoto分配给此视图对象。

在我分配给C_TakePhoto类的ViewController类中,我想要初始化V_TakePhoto类。你可以看到,我希望它有一个回调变量,它在运行时被传递。但是,由于视图已经从界面构建器初始化,所以init(编码器)首先被调用。

现在看来,它似乎很蠢,我需要有2个初始化函数。接口构建器调用它的一个地方,然后当我的ViewController通过回调来访问视图时。此外,我将有许多变量,并且我需要在init(coder)调用中预先初始化它们,然后在ViewController在V_PhotoClass上调用“true”init时重新初始化它们。看起来对我来说很不好意思,必须有一个干净的“正确”方式才能做到这一点。

你能否提出一种更简洁的方式来处理你有变量并需要初始化视图的情况,尽管从接口构建器有一个init(编码器)调用?

回答

0

我会建议在V_TakePhoto创建一个函数,并调用它在这两个V_TakePhotoinit(coder)和ViewController的viewDidLoad(),是这样的:

V_TakePhoto

required init(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
    specialInit() 
} 

func specialInit() { 
    // some of your view initialization 
} 

在您的视图控制器:

@IBOutlet weak var takePhotoView: V_TakePhoto! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // this method is called after the view controller has loaded its view hierarchy into memory. 
    takePhotoView.specialInit() // RE-init 
} 
+0

我希望避免这样的事情,也编译器抱怨,如果init变量,比如说specialInit。到目前为止,Swift要求vars在实际的init方法中是init(你不能在第一个init中使用helper方法) – Aggressor 2014-10-10 18:49:18

+0

对不起,不知道你希望避免什么。非可选变量不能分配给'nil',你必须在'init()'或其声明时初始化它们。所以你应该做的就是将'_takePhotoCallback'定义为一个隐式解包的可选(感叹号),你将在其他地方初始化。它有帮助吗? – Frouo 2014-10-11 09:06:15