题
我的特定类的所有后代都有一个 UILabel
实例变量。所以在我的父类我有 var label: UILabel
.我想在子类中也有它,但作为一个 IBOutlet
.我该怎么做?
我添加了 IBOutlet
同名,并在两个变量声明中添加了weak。但是我得到一个关于"无法使用存储属性复盖"的错误。
我该怎么做?是否有可能不必实例化超类的版本,因为我只希望它用于子类化?
解决方案
只在超类中添加IBOutlet
修改器。
其他提示
通过这样做,你是 re-declaring
该 label
子类中的属性。 IBOutlet
只是一个使用接口构建器的编译器概念。
在斯威夫特 存储的属性 不能在子类中重写或重新声明。它们只能被继承。
但是,您可以复盖 getter
和 setter
一个 properties
在子类中提供额外的验证或功能。请参阅Swift指南: 复盖 getter setter
您需要在超类中声明您的属性 IBOutlet
.
或者你可以在你的子类中创建一个不同的属性。同样,如果您在子类之一中连接您的属性(超级类可能有其他)并且您没有将此实现提供给超类的其他子类,则没有任何意义。
编辑:您还可以设置 label
出口到两个不同的 viewControllers
你的 SuperClass
从故事板,如果你给 Subclasses
storyboard中的名称指向不同的视图控制器。
只需定义
class SuperClass{
@IBOutlet weak var label: UILabel! = nil
}
SubClass1
重新登记 view controller1
在storyboard派生自 SuperClass
SubClass2
重新分配另一个 view controller2
在storyboard派生自 SuperClass
比去 Assistant Editor
并打开 SuperClass
一侧和另一侧 view controller1
并连接出口从 SuperClass
到 label
在故事板中 view controller1
.从...... SuperClass
label
进入故事板 view controller1
现在再次打开 SuperClass
一侧和另一侧 view controller2
并连接出口从 SuperClass
到 label
在故事板中 view controller2
.从...... SuperClass
label
进入故事板 view controller2
如果你点击 SuperClass
你会看到两个标签连接到不同的viewcontroller
同意简短的答案很简单:
“只需添加
@IBOutlet
超类中的修饰符。”
但有一点需要注意:如果您要公开 ViewController,其中 @IBOutlet
通过框架(使用 Carthage)定义,您需要添加 public
变量定义的属性。 编辑:相反,使用 open
访问关键字`。
假设你有一个视图控制器 自定义视图控制器 子类化 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 映射,然后将场景的类切换到子类,同时保留所有映射。
例如。: 子类化CustomViewController
import UIKit
import mymodule
class SubclassedCustomViewController: CustomViewController {
override func viewDidLoad() {
super.viewDidLoad()
myBackgroundView.backgroundColor = UIColor.blueColor()
myLabel.text = "My special subclass text"
}
我意识到这个问题发布了一段时间,但由于我只是挣扎着同样的问题,最后提出了一个解决方案,我想我仍然会发布我的发现......
我理解如下的问题(至少这是我解决的那个):
如何让b类继承b类,每个类都有自己的xib文件,其中包含一些常见的iboutlet属性?进入的目标是能够让超级类处理相关的操作对于其子类(ES)共有的IBOutlet,同时仍然能够使用界面构建器来设计子类的接口。*
为了这样做:
- 在超类中制作iboutlet连接 超类的xib文件
- 从子类xib中制作子类中的iboutlet连接 文件,具有相同的iboutlet属性名称,如超级类中所需的超级类。
- 删除子类中的iboutlet变量的声明