如何在 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 中删除安全区域?