Как подклассифицировать переменную с помощью IBOutlet?

Все потомки моего конкретного класса должны иметь переменную экземпляра UILabel. Поэтому в моем родительском классе есть var label: UILabel. Я хочу иметь его также в sublclass, но как IBOutlet. Как это сделать?

Я добавил IBOutlet с тем же именем и добавил слабые обе декларации переменных. Но я получаю сообщение об ошибке "Не могу переопределить хранимое свойство".

Как я должен это делать? И возможно ли не создавать экземпляр версии суперкласса, поскольку я просто хочу его для подкласса?

Ответ 1

Просто добавьте модификатор IBOutlet в суперкласс.

Ответ 2

Тем самым вы re-declaring свойство label в подклассе. IBOutlet - это просто понятие компилятора для работы с Interface Builder.

В Swift сохраненные свойства не могут быть переопределены или повторно объявлены в подклассе. Они могут быть только унаследованы.

Однако вы можете переопределить getter и setter в течение properties в подклассах, чтобы обеспечить дополнительные валидации или функциональность. Обратитесь к руководству Swift: переопределите метод установки getter setter

Вы должны объявить свою собственность в суперклассе с IBOutlet.

Или вы можете сделать другое свойство в своем подклассе. Также нет никакого смысла, если вы соединяете свое свойство в одном из подклассов (суперкласс может иметь другой), и вы не предоставляете эту реализацию другим подклассам вашего суперкласса.

РЕДАКТИРОВАТЬ: Вы также можете установить viewControllers label для двух разных viewControllers вашего SuperClass из раскадровки, если вы дадите имена Subclasses в раскадровке для разных контроллеров представления.

Просто определите

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

 }

SubClass1 repersent view controller1 в раскадровке, полученной из SuperClass SubClass2 repersent другого view controller2 в раскадровке, полученный из SuperClass

Чем Перейти к Assistant Editor и открытому SuperClass одной стороны, и с другой стороной view controller1 и подключить выход из SuperClass на label в раскадровке в view controller1.Drag от SuperClass label раскадровки в view controller1

enter image description here

Теперь снова открытое SuperClass одна стороны и другая сторона view controller2 и подключить выход из SuperClass на label в раскадровке в view controller2.Drag от SuperClass label раскадровки в view controller2

Если вы нажмете на розетку SuperClass вы увидите две метки, подключенные к различным viewControllers

Ответ 3

Согласился, что короткий ответ просто:

"Просто добавьте модификатор @IBOutlet в суперкласс."

Но одно примечание: если вы будете подвергать ViewController, в котором @IBOutlet определяется через фреймворк (с Карфагентом), вам нужно будет добавить атрибут public к определению переменной. EDIT: используйте open ключевое слово доступа.

Предположим, что у вас есть диспетчер управления CustomViewController подклассом UITableViewController, который вы создадите в кармане. Все, что должно быть доступно для потребительского приложения, должно быть помечено public:

public class CustomViewController: UIViewController {

    override public func viewDidLoad() {
        super.viewDidLoad()
    }

@IBOutlet public var myBackgroundView: UIView!
@IBOutlet public weak var myLabel: UILabel!

Хорошая вещь об этом подходе (и я полностью борюсь с этим прецедентом) заключается в том, что вы можете сделать сопоставление IBOutlet в Interface Builder над суперклассом, а затем переключить класс сцены на подкласс, тогда как сохраняя все отображения.

Например: SubclassedCustomViewController

import UIKit
import mymodule

class SubclassedCustomViewController: CustomViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        myBackgroundView.backgroundColor = UIColor.blueColor()
        myLabel.text = "My special subclass text"
    }

Ответ 4

Я понимаю, что этот вопрос был опубликован некоторое время назад, но так как я только что боролся с той же проблемой и, наконец, нашел решение, я решил, что я все еще буду публиковать свои выводы...

Я понимаю, что проблема заключается в следующем (по крайней мере, тот, который я решил):

Как сделать так, чтобы класс A наследовался от класса B, где каждый класс имеет свой собственный файл XIB с некоторыми общими свойствами IBOutlet? Цель состоит в том, чтобы иметь возможность иметь суперкласс для обработки действий, связанных с IBOutlets, которые являются общими для его подкласса (ов), и в то же время иметь возможность использовать Interface Builder для разработки интерфейса для подкласса (ов). *

Для этого:

  • Установите соединения IBOutlet в суперклассе из файлов XIB суперкласса
  • Создайте соединения IBOutlet в подклассе из файлов XIB подкласса с теми же именами свойств IBOutlet, что и в суперклассе для тех, которые вам нужно наследовать.
  • Удалить объявление переменных IBOutlet в подклассе