Как мне создать подкласс переменной с помощью IBOutlet?

StackOverflow https://stackoverflow.com//questions/25088668

  •  02-01-2020
  •  | 
  •  

Вопрос

Все потомки моего конкретного класса должны иметь 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

enter image description here

Теперь снова открыт 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 в подклассе.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top