如何使用IBOutlet将变量子类化?

Dou*_*ith 13 uiview ios swift ios8

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

我添加了IBOutlet相同的名称,并为两个变量声明添加了弱.但我得到一个错误"无法覆盖存储的属性".

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

cod*_*ter 15

通过这样做,您是子类中re-declaringlabel属性.IBOutlet只是一个使用Interface Builder的编译器概念.

在Swift中,存储的属性不能在子类中重写或重新声明.它们只能被遗传.

但是,您可以覆盖子类中的gettersetter,properties以提供额外的验证或功能.请参阅Swift指南:覆盖getter setter

您需要在superClass中声明您的属性IBOutlet.

或者您可以在子类中创建不同的属性.如果您在一个子类中连接您的属性(超类可能有其他类)并且您没有将此实现提供给您的超类的其他子类,也没有任何意义.

编辑:如果您将故事板中的名称提供给不同的视图控制器,您还可以将label插座设置为两个不同viewControllersSuperClass故事板Subclasses.

只是定义

 class SuperClass{
     @IBOutlet weak var label: UILabel! = nil

 }
Run Code Online (Sandbox Code Playgroud)

SubClass1repersent view controller1在故事板衍生自SuperClass SubClass2repersent另一个view controller2在故事板衍生自SuperClass

比转到Assistant Editor并打开SuperClass一侧和另一侧view controller1并从故事板连接SuperClasslabel故障view controller1板.Drag from SuperClass labelstoryBoard inview controller1

在此输入图像描述

现在再次打开SuperClass一侧和另一侧view controller2并将故障连接SuperClasslabel故障板中view controller2.Drag from SuperClass labelto storyBoard inview controller2

如果单击SuperClass插座,则会看到两个标签连接到不同的viewControllers

  • 我根本听不懂英语......有人能理解这里发生的事情吗请修改这个答案。谢谢 (2认同)

B.R*_*.W. 8

只需IBOutlet在超类中添加修饰符即可.


Sta*_*tan 5

同意简短的回答很简单:

“只需@IBOutlet在超类中添加修饰符。”

但需要注意的是:如果您将公开@IBOutlet通过框架(使用 Carthage)定义的 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!
Run Code Online (Sandbox Code Playgroud)

这种方法的好处(我完全支持这个用例)是你可以在超类的 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"
    }
Run Code Online (Sandbox Code Playgroud)


小智 5

我意识到这个问题是不久前发布的,但由于我只是在同一个问题上挣扎并最终想出了一个解决方案,我想我仍然会发布我的发现......

我理解的问题如下(至少这是我解决的问题):

如何让 A 类从 B 类继承,每个类都有自己的 XIB 文件和一些常见的 IBOutlet 属性?目标是能够让超类处理与其子类共有的 IBOutlets 相关的操作,同时仍然能够使用 Interface Builder 为子类设计接口。*

为此:

  • 从超类的 XIB 文件在超类中建立 IBOutlet 连接
  • 从子类的 XIB 文件在子类中建立 IBOutlet 连接,使用与您需要继承的超类中相同的 IBOutlet 属性名称。
  • 删除子类中IBOutlet变量的声明