swift 如何使用IBOutlet子类化一个变量?

voj3qocg  于 2023-06-04  发布在  Swift
关注(0)|答案(5)|浏览(178)

我的特定类的所有后代都有一个UILabel示例变量。所以在我的父类中,我有var label: UILabel。我也想把它放在子类中,但是作为IBOutlet。我该怎么做?
我添加了同名的IBOutlet,并在两个变量声明中添加了weak。但是我得到了一个关于“无法用存储的属性重写”的错误。
我该怎么做?有没有可能不必示例化超类的版本,因为我只是想用它来子类化?

bsxbgnwa

bsxbgnwa1#

通过这样做,你是re-declaringlabel属性在一个子类。IBOutlet只是一个使用Interface Builder的编译器概念。
在Swift中,* 存储的属性 * 不能在子类中被重写或重新声明。它们只能被继承。
但是,您可以在子类中覆盖propertiesgettersetter,以提供额外的验证或功能。请参阅Swift指南:覆盖getter setter

您需要在superClass中使用IBOutlet声明属性

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

编辑:如果您将Subclasses的名称在story board中指定给不同的view Controller,您也可以将label的插座设置为story board中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的故事板

现在再次打开SuperClass的一侧和另一侧view controller2,并将SuperClass的插座连接到view controller2的故事板中的label。从SuperClasslabel拖动到view controller2的故事板
如果单击SuperClass outlet,则会看到两个连接到不同viewController的标签

whlutmcx

whlutmcx2#

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

egmofgnx

egmofgnx3#

同意简短的答案很简单:
“只需在超类中添加@IBOutlet修饰符。”
但有一点要注意:如果您要公开ViewController,其中@IBOutlet是通过框架(使用Carthage)定义的,则需要将public属性添加到变量定义中。**EDIT:使用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中进行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"
    }
vd8tlhqk

vd8tlhqk4#

我意识到这个问题是前一段时间发布的,但由于我只是在同一个问题上挣扎,最后想出了一个解决方案,我想我还是会发布我的发现...
我理解的问题如下(至少这是我解决的问题):

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

为此:

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

zmeyuzjn5#

查看我的答案here
但是本质上,就像你通常会做的那样,把你的子类挂接到子类中的IBoutlet上,然后创建超类,从子类继承,然后把iboutlet粘贴到超类中。您的连接仍然在查看子类,但该类正在查看超类。

相关问题