如何用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的gettersetter来提供额外的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 labelview controller1故事板。从SuperClass label拖到view controller1 storyBoard

在这里输入图像说明

现在再次打开SuperClass一侧和其他view controller2并从SuperClass连接出口在view controller2 2中的SuperClass labelSuperClass label拖到view controller2 storyBoard

如果你点击SuperClasssockets,你会看到两个标签连接到不同的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" }