2015-08-23 2 views
1

У меня есть небольшая проблема с моим кодом, так что я не могу вызвать функцию. Я создал функцию func changeLabelText(text: String) { mylabel.stringValue = text } в ViewController с тем, что я могу обновить текст в ярлыке. Когда я пытаюсь вызвать функцию из другого класса в Project, я получаю ошибку времени выполнения (EXC_BAD_Instr...), и отладчик держится в строке, где я пытаюсь изменить текст метки, с ошибкой: fatal error: unexpectedly found nil while unwrapping an Optional value. В чем проблема? Может кто-то мне помочь, пожалуйста!Невозможно обновить ярлык от другого класса в Swift

+1

Обновите свой вопрос соответствующим кодом. – rmaddy

+0

Можете ли вы предоставить подробную информацию об ошибке, которую видите? Включая строку и сообщение об ошибке. Мое первоначальное подозрение состоит в том, что это связано с той очередью, которую вы используете, чтобы вызвать метод, но детали ошибки должны дать лучший ключ. –

ответ

2

Что касается ошибки «неожиданно найденного нуля при распаковке необязательного значения», проблема в том, что у вас есть необязательный (судя по фрагменту кода, который вы предоставили, он должен быть неявным образом развернутым необязательным), то есть nil. Скорее всего, mylabel является nil. Либо распечатайте значение, либо добавьте точку останова, и проверьте свойство в отладчике для подтверждения.

Если это nil, вам необходимо выяснить, почему. В нашей дискуссии, то получается, что вы пытаетесь вызвать Log события в контроллере представления:

ViewController().Log("asdf") 

Проблема заключается в том, что это не вызывает Log в существующем контроллере представления, а выражение ViewController() завершает создание нового, совершенно несвязанного контроллера представления, причем его выходы не подключены ни к чему. Таким образом, попытка обновить неявно развернутую розетку вызовет ошибку, которую вы поделили с нами.

Если вы хотите, это отдельный класс (менеджер баз данных объект) сообщить контроллер представления события для того, чтобы позволить контроллер представления для обновления пользовательского интерфейса, есть три общих подхода:

  1. Завершение/которые являются замыканиями/блоками.

    Это используется для простого интерфейса, когда база данных должна информировать контроллер представления о том, когда запрос выполнен.

  2. Протокол делегат-протокол.

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

  3. Уведомление о шаблоне.

    Notifications используются, когда вы хотите свободно связанный интерфейс между объектом базы данных и тем, что обрабатывает эти уведомления. Контроллер вида может регистрироваться как наблюдатель любых уведомлений о конкретном имени с помощью defaultCenter()NSNotificationCenter.Затем объект базы данных может отправлять уведомления об этом имени (предоставление информации через словарь userInfo), и диспетчер представлений будет проинформирован об этих событиях.

+0

@Michael_mhr - Давайте продолжим обсуждение в чате (http://chat.stackoverflow.com/rooms/87812/discussion-between-rob-and-michael-mhr). – Rob

-1

Несколько вещей, которые вы называете экземпляр контроллера представления правильно

например, если имя класса ViewController, в контроллере мнение о том, что вы вызываете функцию, что вы используете

LET VC = ViewController()

, а затем использовать VC.yourFunctionName

также вместо того, чтобы использовать stringValue .text

+0

Re 'stringValue' vs' text', первоначально этот вопрос был помечен как iOS, поэтому вы правы, что 'UILabel' использует' text'. ОП уточнил/исправил вопрос, давая понять, что это «NSLabel» в Mac OS X, и в этом случае «stringValue» верен. – Rob

+0

Кроме того, шаблон 'let vc = ViewController()' почти наверняка не прав: во-первых, он может даже не иметь VC в проекте Mac OS. Во-вторых, создание экземпляра VC без ссылки на идентификатор NIB и/или раскадровки является общим _source_ такого рода проблем, а не исправлением для него. Нам нужно было бы узнать намного больше о дизайне приложения, прежде чем мы поехали по этой дороге. – Rob

+0

Это то же самое, что я пробовал до –

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