如何在 Swift 1.0 中覆盖 UIView 初始化程序

Posted

技术标签:

【中文标题】如何在 Swift 1.0 中覆盖 UIView 初始化程序【英文标题】:How to override UIView initializer in Swift 1.0 【发布时间】:2014-11-10 17:51:47 【问题描述】:

Swift (1.0) 继承让我难以置信。我可以相信必须问一些像这样简单的事情,但我无法弄清楚。我有我的自定义视图,我希望能够使用 init(frame: CGRect) 以编程方式创建它,并从故事板加载它,在这种情况下,应该使用 init(coder aDecoder: NSCoder) 进行初始化。在这两种情况下,我都想调用我的自定义设置方法。像这样:

import UIKit

class CustomView: UIView 

    override convenience init(frame: CGRect) 
        super.init(frame: frame)
        self.myCustomSetup()
    

    required init(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
        self.myCustomSetup()
    

    func myCustomSetup() 
        self.backgroundColor = UIColor.redColor()
    

这似乎不起作用,从 swift 文档中我了解到,所有便利初始化程序都调用的类应该只有一个指定的初始化程序。在 UIView 的情况下,这应该是 init(coder aDecoder: NSCoder)。但是,我不能在init(frame: CGRect) 中创建aDecoder: NSCoder,我也不能将 nil 传递为它不是可选的。我该怎么办 ?我怎样才能同时覆盖它们?

【问题讨论】:

initWithFrame: 也是一个指定的初始化器。 是的,这行得通,谢谢。 Xcode建议使用方便关键字:-(好吧,我不明白的是。从文档中,每个类应该只有一个指定的初始化程序。所有其他初始化都应该调用那个。我怎么能初始化我的类(和UIView)有两个独立的。在某种意义上分开一个不会调用另一个指定的另一个?我错了什么? 你确定吗?对我来说听起来不对。也许,作为一个指导方针,您应该尽可能地指定一些初始化器,但限制为一个是没有意义的。 initWithFrame:initWithCoder: 尽可能不同。 非常感谢,我似乎错了。 【参考方案1】:

一个类必须至少有一个指定的初始化器。它可能不止一个。

要使代码正常工作,您只需从 init(frame: CGRect) 中删除关键字 convenience

【讨论】:

可以,谢谢。 Xcode建议使用方便关键字:-(好吧,我不明白的是。从文档中,每个类应该只有一个指定的初始化程序。所有其他初始化都应该调用那个。我怎么能初始化我的类(和UIView)有两个单独的。在某种意义上分开一个不调用另一个指定的?我错了什么? 一个类必须至少有一个指定的初始化器。它可能不止一个。 好吧,这就是我没有意识到的。谢谢! 这意味着init 不像Objective-C 那样返回自我? 我刚刚在 Xcode 6.3 中进行了测试,删除 convenience 会删除错误。如果它对您不起作用,请发布一个新问题,粘贴给您带来麻烦的确切代码,然后粘贴您收到的错误消息。

以上是关于如何在 Swift 1.0 中覆盖 UIView 初始化程序的主要内容,如果未能解决你的问题,请参考以下文章

如何覆盖子类的 swift 协议函数(例如 UIView 中的 UILabel)

iOS Swift 3 - 面板点击后删除覆盖 UIView

如何在 Swift 中以编程方式从 UIView 中删除安全区域?

如何快速覆盖 UIView.pointInside?

在 Swift 3.1 中为 UIView 子类设置默认外观而不覆盖 initialize()

Swift - 如何根据视频播放器框架的大小动态调整 UIView 的大小