Ответ 1
Просто добавьте модификатор IBOutlet
в суперкласс.
Все потомки моего конкретного класса должны иметь переменную экземпляра UILabel
. Поэтому в моем родительском классе есть var label: UILabel
. Я хочу иметь его также в sublclass, но как IBOutlet
. Как это сделать?
Я добавил IBOutlet
с тем же именем и добавил слабые обе декларации переменных. Но я получаю сообщение об ошибке "Не могу переопределить хранимое свойство".
Как я должен это делать? И возможно ли не создавать экземпляр версии суперкласса, поскольку я просто хочу его для подкласса?
Просто добавьте модификатор IBOutlet
в суперкласс.
Тем самым вы 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
Теперь снова открытое SuperClass
одна стороны и другая сторона view controller2
и подключить выход из SuperClass
на label
в раскадровке в view controller2
.Drag от SuperClass
label
раскадровки в view controller2
Если вы нажмете на розетку SuperClass
вы увидите две метки, подключенные к различным viewControllers
Согласился, что короткий ответ просто:
"Просто добавьте модификатор
@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"
}
Я понимаю, что этот вопрос был опубликован некоторое время назад, но так как я только что боролся с той же проблемой и, наконец, нашел решение, я решил, что я все еще буду публиковать свои выводы...
Я понимаю, что проблема заключается в следующем (по крайней мере, тот, который я решил):
Как сделать так, чтобы класс A наследовался от класса B, где каждый класс имеет свой собственный файл XIB с некоторыми общими свойствами IBOutlet? Цель состоит в том, чтобы иметь возможность иметь суперкласс для обработки действий, связанных с IBOutlets, которые являются общими для его подкласса (ов), и в то же время иметь возможность использовать Interface Builder для разработки интерфейса для подкласса (ов). *
Для этого: