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

时间:2014-08-01 21:03:30

标签: ios uiview swift ios8

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

我添加了同名的IBOutlet,并在两个变量声明中添加了弱。但是我收到一个关于“无法覆盖存储属性”的错误。

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

4 个答案:

答案 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 SuperClassSubClass2

派生的故事板中重新占据另一个view controller2

转到SuperClass并打开Assistant Editor一侧和另一侧SuperClass并在view controller1的storyBoard中将SuperClasslabel的插座连接起来在view controller1

中从SuperClass label拖到storyBoard

enter image description here

现在再次打开view controller1一侧和另一侧SuperClass并在view controller2的storyBoard中将SuperClass的{​​{1}}插座连接到label。拖出{{1} } view controller2SuperClass

中的storyBoard

如果单击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来设计子类的接口。*

为此:

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