我的特定类的所有后代都有一个UILabel示例变量。所以在我的父类中,我有var label: UILabel。我也想把它放在子类中,但是作为IBOutlet。我该怎么做?我添加了同名的IBOutlet,并在两个变量声明中添加了weak。但是我得到了一个关于“无法用存储的属性重写”的错误。我该怎么做?有没有可能不必示例化超类的版本,因为我只是想用它来子类化?
UILabel
var label: UILabel
IBOutlet
bsxbgnwa1#
通过这样做,你是re-declaring的label属性在一个子类。IBOutlet只是一个使用Interface Builder的编译器概念。在Swift中,* 存储的属性 * 不能在子类中被重写或重新声明。它们只能被继承。但是,您可以在子类中覆盖properties的getter和setter,以提供额外的验证或功能。请参阅Swift指南:覆盖getter setter
re-declaring
label
properties
getter
setter
getter setter
您需要在superClass中使用IBOutlet声明属性。
或者你可以在子类中创建一个不同的属性。同样,如果你在一个子类(超类可能有其他子类)中连接你的属性,并且你没有将这个实现提供给你的超类的其他子类,那也没有意义。
编辑:如果您将Subclasses的名称在story board中指定给不同的view Controller,您也可以将label的插座设置为story board中SuperClass的两个不同的viewControllers。
Subclasses
SuperClass
viewControllers
定义一下
class SuperClass{ @IBOutlet weak var label: UILabel! = nil }
SubClass1表示从SuperClass派生的脚本中的view controller1SubClass2表示从SuperClass派生的脚本中的另一个view controller2然后转到Assistant Editor,打开SuperClass的一侧和另一侧view controller1,并将SuperClass的插座连接到view controller1的故事板中的label。从SuperClasslabel拖动到view controller1的故事板
SubClass1
view controller1
SubClass2
view controller2
Assistant Editor
现在再次打开SuperClass的一侧和另一侧view controller2,并将SuperClass的插座连接到view controller2的故事板中的label。从SuperClasslabel拖动到view controller2的故事板如果单击SuperClass outlet,则会看到两个连接到不同viewController的标签
whlutmcx2#
只需在超类中添加IBOutlet修饰符。
egmofgnx3#
同意简短的答案很简单:“只需在超类中添加@IBOutlet修饰符。”但有一点要注意:如果您要公开ViewController,其中@IBOutlet是通过框架(使用Carthage)定义的,则需要将public属性添加到变量定义中。**EDIT:使用open访问关键字。** 假设您有一个视图控制器**CustomViewController**子类**UITableViewController**,您将在Carthage交付的框架中构建它。消费者应用程序应该访问的所有内容都应该标记为public`:
@IBOutlet
public
open
。** 假设您有一个视图控制器**CustomViewController**子类**UITableViewController**,您将在Carthage交付的框架中构建它。消费者应用程序应该访问的所有内容都应该标记为
public class CustomViewController: UIViewController { override public func viewDidLoad() { super.viewDidLoad() } @IBOutlet public var myBackgroundView: UIView! @IBOutlet public weak var myLabel: UILabel!
这种方法的好处(我完全支持这种用例)是,您可以在超类上的Interface Builder中进行IBOutletMap,然后将Scene的类切换到子类,同时保留所有Map。例如:SubclassedCustomViewController
import UIKit import mymodule class SubclassedCustomViewController: CustomViewController { override func viewDidLoad() { super.viewDidLoad() myBackgroundView.backgroundColor = UIColor.blueColor() myLabel.text = "My special subclass text" }
vd8tlhqk4#
我意识到这个问题是前一段时间发布的,但由于我只是在同一个问题上挣扎,最后想出了一个解决方案,我想我还是会发布我的发现...我理解的问题如下(至少这是我解决的问题):
为此:
zmeyuzjn5#
查看我的答案here但是本质上,就像你通常会做的那样,把你的子类挂接到子类中的IBoutlet上,然后创建超类,从子类继承,然后把iboutlet粘贴到超类中。您的连接仍然在查看子类,但该类正在查看超类。
5条答案
按热度按时间bsxbgnwa1#
通过这样做,你是
re-declaring
的label
属性在一个子类。IBOutlet
只是一个使用Interface Builder的编译器概念。在Swift中,* 存储的属性 * 不能在子类中被重写或重新声明。它们只能被继承。
但是,您可以在子类中覆盖
properties
的getter
和setter
,以提供额外的验证或功能。请参阅Swift指南:覆盖getter setter
您需要在superClass中使用
IBOutlet
声明属性。或者你可以在子类中创建一个不同的属性。同样,如果你在一个子类(超类可能有其他子类)中连接你的属性,并且你没有将这个实现提供给你的超类的其他子类,那也没有意义。
编辑:如果您将
Subclasses
的名称在story board中指定给不同的view Controller,您也可以将label
的插座设置为story board中SuperClass
的两个不同的viewControllers
。定义一下
SubClass1
表示从SuperClass
派生的脚本中的view controller1
SubClass2
表示从SuperClass
派生的脚本中的另一个view controller2
然后转到
Assistant Editor
,打开SuperClass
的一侧和另一侧view controller1
,并将SuperClass
的插座连接到view controller1
的故事板中的label
。从SuperClass
label
拖动到view controller1
的故事板现在再次打开
SuperClass
的一侧和另一侧view controller2
,并将SuperClass
的插座连接到view controller2
的故事板中的label
。从SuperClass
label
拖动到view controller2
的故事板如果单击
SuperClass
outlet,则会看到两个连接到不同viewController的标签whlutmcx2#
只需在超类中添加
IBOutlet
修饰符。egmofgnx3#
同意简短的答案很简单:
“只需在超类中添加
@IBOutlet
修饰符。”但有一点要注意:如果您要公开ViewController,其中
@IBOutlet
是通过框架(使用Carthage)定义的,则需要将public
属性添加到变量定义中。**EDIT:使用open
访问关键字。** 假设您有一个视图控制器**CustomViewController**子类**UITableViewController**,您将在Carthage交付的框架中构建它。消费者应用程序应该访问的所有内容都应该标记为
public`:这种方法的好处(我完全支持这种用例)是,您可以在超类上的Interface Builder中进行IBOutletMap,然后将Scene的类切换到子类,同时保留所有Map。
例如:SubclassedCustomViewController
vd8tlhqk4#
我意识到这个问题是前一段时间发布的,但由于我只是在同一个问题上挣扎,最后想出了一个解决方案,我想我还是会发布我的发现...
我理解的问题如下(至少这是我解决的问题):
为此:
zmeyuzjn5#
查看我的答案here
但是本质上,就像你通常会做的那样,把你的子类挂接到子类中的IBoutlet上,然后创建超类,从子类继承,然后把iboutlet粘贴到超类中。您的连接仍然在查看子类,但该类正在查看超类。