Как мне создать подкласс переменной с помощью IBOutlet?
Вопрос
Все потомки моего конкретного класса должны иметь UILabel
переменная экземпляра.Итак, в моем родительском классе у меня есть var label: UILabel
.Я тоже хочу иметь его в подклассе, но как IBOutlet
.Как мне это сделать?
Я добавил IBOutlet
с тем же именем и добавил слабые слова к обоим объявлениям переменных.Но я получаю сообщение об ошибке «Невозможно переопределить сохраненное свойство».
Как мне следует это делать?И возможно ли не создавать экземпляр версии суперкласса, поскольку я просто хочу, чтобы он был подклассом?
Решение
Просто добавьте IBOutlet
модификатор в суперклассе.
Другие советы
Поступая так, вы re-declaring
тот label
свойство в подклассе. IBOutlet
это просто понятие компилятора для работы с Interface Builder.
В Свифте сохраненные свойства не может быть переопределен или переобъявлен в подклассе.Они могут передаваться только по наследству.
Однако вы можете переопределить getter
и setter
из properties
в подклассах для обеспечения дополнительных проверок или функций.Обратитесь к руководству по Swift: переопределить getter setter
Вам необходимо объявить свою собственность в суперклассе с помощью IBOutlet
.
Или вы можете создать другое свойство в своем подклассе.Также нет смысла подключать свое свойство к одному из подклассов (суперкласс может иметь другой) и не предоставлять эту реализацию другим подклассам вашего суперкласса.
РЕДАКТИРОВАТЬ:Вы также можете установить label
выход на два разных viewControllers
вашей SuperClass
из раскадровки, если дашь Subclasses
имена в раскадровке для разных контроллеров представления.
Просто определите
class SuperClass{
@IBOutlet weak var label: UILabel! = nil
}
SubClass1
представитель view controller1
в раскадровке, полученной из SuperClass
SubClass2
представлять другого view controller2
в раскадровке, полученной из SuperClass
Чем перейти Assistant Editor
и открыть SuperClass
одна сторона и другая сторона view controller1
и подключите розетку от SuperClass
к label
в StoryBoard в view controller1
.Перетащите из SuperClass
label
в StoryBoard в view controller1
Теперь снова открыт SuperClass
одна сторона и другая сторона view controller2
и подключите розетку от SuperClass
к label
в StoryBoard в view controller2
.Перетащите из SuperClass
label
в StoryBoard в view controller2
Если вы нажмете на SuperClass
выход, чем вы увидите две метки, связанные с разными контроллерами представления.
Согласен, что краткий ответ прост:
«Просто добавьте
@IBOutlet
модификатор в суперклассе».
Однако одно замечание:если вы будете предоставлять ViewController, в котором @IBOutlet
определяется через фреймворк (с Carthage), вам нужно будет добавить public
атрибут определения переменной. РЕДАКТИРОВАТЬ:вместо этого используйте open
ключевое слово доступа`.
Допустим, у вас есть контроллер представления. Кастомвиевконтроллер создание подклассов УИТаблевиевконтроллер, который вы создадите в рамках платформы Carthage.Все, что должно быть доступно потребительскому приложению, должно быть помечено 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 для суперкласса, а затем переключить класс сцены на подкласс, сохранив при этом все сопоставления.
Например.: ПодклассифицированныйCustomViewController
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 для разработки интерфейса для подкласса(ов).*
Для этого:
- Сделайте подключения iboutlet в суперклассе из файлов Superclass 'XIB
- Сделайте подключения iboutlet в подклассе из подклассных файлов XIB, с теми же названиями свойств iBoutlet, что и в Superclass для тех, которые вам нужно наследовать.
- Удалите объявление переменных IBOutlet в подклассе.