2016-02-01 2 views
1

У меня есть класс с именем Sentence, и я хотел бы установить text свойство моего @IBOutlet в моем ViewController в одном из методов Sentence. Это возможно? Если нет, в самом методе класса Sentence, как я могу сделать вызов или функцию, которая устанавливает мой текст из метода класса?Как установить @IBOutlet текст из метода класса

Вот мой UILabel

@IBOutlet weak var kleinGrossLabel: UILabel!

+0

@MikeG Это не касается ни одной проблемы, заданной этим вопросом, например, как правильно установить текст из класса, который не имеет прямого доступа к kleinGrossLabel. –

+0

@WillM.Я неправильно понял вопрос, спасибо за головы – MikeG

ответ

5

Вы не можете назначить IBOutlet из UIViewController в методе класса другого класса. Как этот класс (в вашем случае Sentence) должен знать о контроллере?

У вас есть несколько вариантов:

  1. сохранить ссылку на ваш контроллер представления в вашем Sentence объекте.
  2. Использование делегирования: установите делегат на свой экземпляр Sentence, который указывает на контроллер представления, и один из методов протокола получает доступ к содержимому IBOutlet.
  3. Используйте NSNotificationCenter, чтобы отправить уведомление с вашего Sentence объекта, который прослушивает ваш контроллер просмотра, и может непосредственно обновить его IBOutlet.
+0

Спасибо JAL. Какая из следующих трех является лучшей практикой? Или, если эквивалент, который вы бы лично использовали? – Thalatta

+1

http://stackoverflow.com/questions/1927965/nsnotificationcenter-vs-delegation-using-protocols имеет хорошую информацию –

+0

Вопросы «Лучшая практика», как правило, не подходят для переполнения стека, поскольку они в основном основаны на мнениях. Это все о том, какой вариант лучше всего подходит для вашей архитектуры приложения. Делегирование является популярным образцом в программировании iOS, хотя уведомления, вероятно, являются самыми легкими в использовании. Я бы не рекомендовал хранить ссылку (вариант 1). – JAL

3

Плотная связь была бы тогда, когда класс, такой как Sentence, берет на себя ответственность за что-то вне его проблемы, например, на выходе контроллера.

Эти изменения могут быть трудно отследить, так как это не очевидно, когда состояние было изменено.

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

Альтернативный способ

Вы можете переместить эту ответственность из Sentence, предоставляя общественности метод Sentence который возвращает нужное свойство.

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

Он также позволяет диспетчеру просмотра (с точки зрения MVC) нести полную ответственность за изменение свойства текста вида.

Теперь из контроллера вида вы можете вызвать публичный метод экземпляра предложения, а затем установить свойство текста IBOutlet контроллера представления на основе возвращаемого значения. Это станет очевидным, где и почему текст изменился, вместо того, чтобы скрывать это изменение в другом (классе) методе.

+1

Это правильный путь, если диспетчер представлений знает, когда вытащить обновленную информацию из класса Sentence. Тем не менее, решение JAL правильное, если диспетчеру просмотра нужна эта информация. Зависит от ситуации, которая лучше. –

Смежные вопросы