【问题标题】:How to inherit @IBOutlets from parent ViewController?如何从父 ViewController 继承 @IBOutlets?
【发布时间】:2020-03-16 05:34:26
【问题描述】:

我拼命想了解为什么下面的实现不起作用。

我正在创建一个使用 Interface Builder 实现的父 ViewController,并且有一些连接的 @IBOutlets。 当我为这个 ViewController 创建一个子类时,我在运行时收到一个错误,说我所有的 @IBOutlets 都是 nil

我尝试使用我的 init 方法“玩转”,看看如何确保我的 @IBOutlets 被初始化,但到目前为止没有运气。

任何人都知道如何使这种实现成为可能?

// Super class
class ScenesViewController: UIViewController {

    // MARK: - IBOutlets
    @IBOutlet weak var scenesCollectionView: UICollectionView!
    @IBOutlet weak var topButtonLeft: UIButton!
    @IBOutlet weak var topButtonRight: UIButton!
    @IBOutlet weak var topButtonsStackView: UIStackView!
    @IBOutlet weak var scenesPageControl: UIPageControl!
    @IBOutlet weak var contentNestedStackView: UIStackView!


    // MARK: - Init Method
    convenience init(scenes: [Scene],
                     mainButtonTitle: String,
                     secondaryButtonTitle: String? = nil,
                     topButton: SceneTopButton? = nil,
                     bottomNavLinkTitle: String? = nil,
                     bottomNavLinkColoredText: String? = nil) {

        self.init()

        self.scenes = scenes
        self.mainButtonTitle = mainButtonTitle
        self.secondaryButtonTitle = secondaryButtonTitle
        self.topButton = topButton
        self.bottomNavLinkTitle = bottomNavLinkTitle
        self.bottomNavLinkColoredText = bottomNavLinkColoredText
    }
// Subclass
class OnboardingViewController: ScenesViewController {

    convenience init() {

        self.init() // Not working

        self.scenes = SCENES.ONBOARDING // a constant object
        self.mainButtonTitle = "mainButtonTitle"
        self.secondaryButtonTitle = "secondaryButtonTitle"
        self.topButton = .skip
        self.bottomNavLinkTitle = "bottomNavLinkTitle"
        self.bottomNavLinkColoredText = "Title"
    }


    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        setupButton()
    }

self.init() 方法显然创建了一个循环,所以它是不行的。但想不出如何正确实例化插座。

【问题讨论】:

标签: ios swift


【解决方案1】:

首先,当您要初始化父级时,它应该是super.init()

其次,您不能简单地继承在故事板中完成的布局。检查这个答案here

您可以做的是从这个 viewController 继承,但是您需要为每个子类手动连接 IBOutlets。这意味着,您需要转到 Storyboards,再次布局视图,连接父视图控制器中的 IBOutlets,然后连接子类中的 outlet(如果有)。

更新

选择您的 OnboardingViewController 并转到 Connections Inspector。

从空白圆圈中拖动(如图所示)并连接到 OnboardingViewController 的相应 UI 元素。

【讨论】:

  • 所以我需要手动将ScenesViewController.xib 中的@IBOutlets 连接到OnboardingViewController.swift,对吗?
  • 我更新了我的答案。反之亦然:将从ScenesViewController 继承的@IBOutlets 连接到OnboardingViewController.xib(如果通过笔尖完成)。
  • 我要特别感谢这位“勇敢”的人,他只是简单地投了反对票,没有任何解释。
  • 我尝试过投票,但帖子太少,所以没有出现。非常感谢
猜你喜欢
  • 1970-01-01
  • 2022-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多