У меня есть небольшая проблема с моим кодом, так что я не могу вызвать функцию. Я создал функцию func changeLabelText(text: String) { mylabel.stringValue = text }
в ViewController с тем, что я могу обновить текст в ярлыке. Когда я пытаюсь вызвать функцию из другого класса в Project, я получаю ошибку времени выполнения (EXC_BAD_Instr...
), и отладчик держится в строке, где я пытаюсь изменить текст метки, с ошибкой: fatal error: unexpectedly found nil while unwrapping an Optional value
. В чем проблема? Может кто-то мне помочь, пожалуйста!Невозможно обновить ярлык от другого класса в Swift
ответ
Что касается ошибки «неожиданно найденного нуля при распаковке необязательного значения», проблема в том, что у вас есть необязательный (судя по фрагменту кода, который вы предоставили, он должен быть неявным образом развернутым необязательным), то есть nil
. Скорее всего, mylabel
является nil
. Либо распечатайте значение, либо добавьте точку останова, и проверьте свойство в отладчике для подтверждения.
Если это nil
, вам необходимо выяснить, почему. В нашей дискуссии, то получается, что вы пытаетесь вызвать Log
события в контроллере представления:
ViewController().Log("asdf")
Проблема заключается в том, что это не вызывает Log
в существующем контроллере представления, а выражение ViewController()
завершает создание нового, совершенно несвязанного контроллера представления, причем его выходы не подключены ни к чему. Таким образом, попытка обновить неявно развернутую розетку вызовет ошибку, которую вы поделили с нами.
Если вы хотите, это отдельный класс (менеджер баз данных объект) сообщить контроллер представления события для того, чтобы позволить контроллер представления для обновления пользовательского интерфейса, есть три общих подхода:
Завершение/которые являются замыканиями/блоками.
Это используется для простого интерфейса, когда база данных должна информировать контроллер представления о том, когда запрос выполнен.
Протокол делегат-протокол.
Образец delegation (обычно соответствующий некоторым хорошо установленным protocol) используется для богатых интерфейсов, где база данных должна информировать контроллер вида из множества различных типов событий.
Уведомление о шаблоне.
Notifications используются, когда вы хотите свободно связанный интерфейс между объектом базы данных и тем, что обрабатывает эти уведомления. Контроллер вида может регистрироваться как наблюдатель любых уведомлений о конкретном имени с помощью
defaultCenter()
NSNotificationCenter
.Затем объект базы данных может отправлять уведомления об этом имени (предоставление информации через словарьuserInfo
), и диспетчер представлений будет проинформирован об этих событиях.
@Michael_mhr - Давайте продолжим обсуждение в чате (http://chat.stackoverflow.com/rooms/87812/discussion-between-rob-and-michael-mhr). – Rob
Несколько вещей, которые вы называете экземпляр контроллера представления правильно
например, если имя класса ViewController, в контроллере мнение о том, что вы вызываете функцию, что вы используете
LET VC = ViewController()
, а затем использовать VC.yourFunctionName
также вместо того, чтобы использовать stringValue .text
Re 'stringValue' vs' text', первоначально этот вопрос был помечен как iOS, поэтому вы правы, что 'UILabel' использует' text'. ОП уточнил/исправил вопрос, давая понять, что это «NSLabel» в Mac OS X, и в этом случае «stringValue» верен. – Rob
Кроме того, шаблон 'let vc = ViewController()' почти наверняка не прав: во-первых, он может даже не иметь VC в проекте Mac OS. Во-вторых, создание экземпляра VC без ссылки на идентификатор NIB и/или раскадровки является общим _source_ такого рода проблем, а не исправлением для него. Нам нужно было бы узнать намного больше о дизайне приложения, прежде чем мы поехали по этой дороге. – Rob
Это то же самое, что я пробовал до –
- 1. Невозможно обновить ярлык в ячейке UICollectionView (Swift)
- 2. Как обновить ярлык из другого класса C#
- 3. изменить ярлык от другого viewcontroller on swift
- 4. Обновить ярлык из другого потока
- 5. Swift/MotionKit.framework/как обновить ярлык
- 6. Swift - Обновить/Обновить ярлык, отображающий время
- 7. Winforms: Обновить ярлык на форме из другого класса
- 8. Невозможно обновить ярлык внутри keyPressed()
- 9. Как обновить TextView от другого класса
- 10. Swift: Как наблюдать за изменением свойства класса от другого класса
- 11. объекта Access UI от другого класса Swift
- 12. SWIFT: как использовать performSegueWithIdentifier от другого класса
- 13. Как обновить значение label.text в swift из другого класса
- 14. Change MasterViewController TabBarItem ярлык от другого ViewController
- 15. Невозможно обновить ярлык с помощью таймера
- 16. Как обновить TextView от другого
- 17. Swift: Как обновить UILabel из другого класса X: UIButton
- 18. Обновить ярлык в UIPageView
- 19. Невозможно обновить ярлык перед вызовом функции
- 20. Невозможно обновить ярлык Внешняя панель обновления
- 21. Как обновить метод другого класса?
- 22. Обновить кнопку из другого класса
- 23. Обновить ярлык на MainWindow
- 24. Обновить ярлык из основного класса с помощью фонового работника из другого класса
- 25. swift - Инициализация другого класса внутри класса?
- 26. Как обновить ярлык fxml от рабочего фона?
- 27. Значения от другого класса
- 28. Событие от другого класса
- 29. Невозможно обновить наблюдаемый из одного viewModel от другого
- 30. как обновить одну метку xib от другого класса
Обновите свой вопрос соответствующим кодом. – rmaddy
Можете ли вы предоставить подробную информацию об ошибке, которую видите? Включая строку и сообщение об ошибке. Мое первоначальное подозрение состоит в том, что это связано с той очередью, которую вы используете, чтобы вызвать метод, но детали ошибки должны дать лучший ключ. –