如何用IBOutlet子类化一个variables?
所有我的具体类的后代都有一个UILabel
实例variables。 所以在我的父类我有var label: UILabel
。 我也想在sublclass中,但作为IBOutlet
。 我该怎么做呢?
我添加了相同名称的IBOutlet
,并对两个variables声明都添加了弱点。 但是我收到一个关于“无法用存储的属性覆盖”的错误。
我应该怎么做? 是否有可能不需要实例化超类的版本,因为我只是想要它的子类?
只需在超类中添加IBOutlet
修饰符。
通过这样做,您将在子类中re-declaring
label
属性。 IBOutlet
只是编译器在界面构build器中引用的概念。
Stored Properties
不能被重写,也不能在子类中redeclare
。它们可以被inheritance。在子类中re-declare
一个property
是没有意义的,因为它已经通过inheritance存在于你的超类中了。
但是你可以重写子类中properties的getter
和setter
来提供额外的validation或function。请参阅swift指南来覆盖getter setter
您需要使用IBOutlet
在superClass中声明您的财产 。
或者你可以在你的子类中创build一个不同的属性。 同样,如果你将你的属性连接到一个子类(超类可能有其他类),而你没有将这个实现提供给你的超类的其他子类,那也没有意义。
编辑 :如果您将故事板中的Subclasses
名称赋予不同的视图控制器,也可以将故事板的label
出口设置为viewControllers
的两个不同视图控制器。
只要定义
class SuperClass{ @IBOutlet weak var label: UILabel! = nil }
SubClass1
SuperClass
view controller1
派生自SuperClass
SubClass2
故事板SuperClass
另一个view controller2
派生自SuperClass
故事板
比转到Assistant Editor
并打开SuperClass
一侧和其他view controller1
和连接sockets从SuperClass
label
在view controller1
故事板。从SuperClass
label
拖到view controller1
storyBoard
现在再次打开SuperClass
一侧和其他view controller2
并从SuperClass
连接出口在view controller2
2中的SuperClass
label
从SuperClass
label
拖到view controller2
storyBoard
如果你点击SuperClass
sockets,你会看到两个标签连接到不同的viewControllers
同意简短的答案是:
“只需在超类中添加
@IBOutlet
修饰符。”
但请注意一点:如果您要公开通过框架(使用Carthage)定义@IBOutlet
的ViewController,则需要将public
属性添加到variables定义中。 编辑:相反,使用open
存取关键字。
比方说,你有一个视图控制器CustomViewControllerinheritance UITableViewController ,你将在迦太基交付的框架中build立。 消费者应用程序应该可以访问的所有东西都应该标记为public
:
public class CustomViewController: UIViewController { override public func viewDidLoad() { super.viewDidLoad() } @IBOutlet public var myBackgroundView: UIView! @IBOutlet public weak var myLabel: UILabel!
关于这种方法的好处(我完全用这个用例),你可以在Interface Builder中对超类进行IBOutlet映射,然后把场景的类切换到子类,同时保留所有的映射。
例如: SubclassedCustomViewController
import UIKit import mymodule class SubclassedCustomViewController: CustomViewController { override func viewDidLoad() { super.viewDidLoad() myBackgroundView.backgroundColor = UIColor.blueColor() myLabel.text = "My special subclass text" }