我的特定类的所有后代都有一个 UILabel 实例变量。所以在我的父类我有 var label: UILabel.我想在子类中也有它,但作为一个 IBOutlet.我该怎么做?

我添加了 IBOutlet 同名,并在两个变量声明中添加了weak。但是我得到一个关于"无法使用存储属性复盖"的错误。

我该怎么做?是否有可能不必实例化超类的版本,因为我只希望它用于子类化?

有帮助吗?

解决方案

只在超类中添加IBOutlet修改器。

其他提示

通过这样做,你是 re-declaringlabel 子类中的属性。 IBOutlet 只是一个使用接口构建器的编译器概念。

在斯威夫特 存储的属性 不能在子类中重写或重新声明。它们只能被继承。

但是,您可以复盖 gettersetter 一个 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 并连接出口从 SuperClasslabel 在故事板中 view controller1.从...... SuperClass label 进入故事板 view controller1

enter image description here

现在再次打开 SuperClass 一侧和另一侧 view controller2 并连接出口从 SuperClasslabel 在故事板中 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变量的声明
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top