我的特定类的所有后代都有一个UILabel
实例变量。所以在我的父类中我有var label: UILabel
。我想在子类中使用它,但是作为IBOutlet
。我该怎么做?
我添加了同名的IBOutlet
,并在两个变量声明中添加了弱。但是我收到一个关于“无法覆盖存储属性”的错误。
我该怎么做?是否有可能不必实例化超类的版本,因为我只想将其用于子类化?
答案 0 :(得分:14)
通过这样做,您是re-declaring
子类中的label
属性。 IBOutlet
只是使用Interface Builder的编译器概念。
在Swift中存储的属性无法在子类中重写或重新声明。它们只能被遗传。
但是,您可以覆盖子类中getter
的{{1}}和setter
以提供额外的验证或功能。请参阅Swift指南:override getter setter
您需要使用properties
在superClass中声明您的媒体资源。
或者您可以在子类中创建不同的属性。如果您在一个子类中连接您的属性(超类可能有其他类)并且您没有将此实现提供给您的超类的其他子类,也没有任何意义。
编辑:如果您提供IBOutlet
个姓名,您还可以将label
个来自设置为故事板中viewControllers
的{{1}}个SuperClass
故事板到不同的视图控制器。
只需定义
Subclasses
来自 class SuperClass{
@IBOutlet weak var label: UILabel! = nil
}
的故事板中的 SubClass1
重新view controller1
SuperClass
在SubClass2
view controller2
转到SuperClass
并打开Assistant Editor
一侧和另一侧SuperClass
并在view controller1
的storyBoard中将SuperClass
与label
的插座连接起来在view controller1
SuperClass
label
拖到storyBoard
现在再次打开view controller1
一侧和另一侧SuperClass
并在view controller2
的storyBoard中将SuperClass
的{{1}}插座连接到label
。拖出{{1} } view controller2
到SuperClass
如果单击label
插座,则会看到两个标签连接到不同的viewControllers
答案 1 :(得分:8)
只需在超类中添加IBOutlet
修饰符。
答案 2 :(得分:4)
同意简短的回答是:
"只需在超类中添加
@IBOutlet
修饰符。"
但需要注意的是:如果您将公开通过框架(使用Carthage)定义@IBOutlet
的ViewController,则需要将public
属性添加到变量定义中。 编辑:相反,请使用open
访问关键字。
假设您有一个视图控制器 CustomViewController 子类化 UITableViewController ,您将在Carthage提供的框架中构建它。消费者应用程序应该可访问的所有内容都应标记为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"
}
答案 3 :(得分:0)
我意识到这个问题是在不久前发布的,但由于我只是在努力解决同样的问题并最终想出了一个解决方案,我想我还是会发布我的发现......
我理解问题如下(至少那是我解决的问题):
如何让A类继承自B类,每个类都有自己的XIB文件和一些常见的IBOutlet属性?目标是让超类能够处理相关的动作到它的子类共有的IBOutlets,同时仍然能够使用Interface Builder来设计子类的接口。*
为此: