Причины, по которым IBOutlet будет нулевым - PullRequest
7 голосов
/ 03 июня 2011

По каким причинам IBOutlet (подключен) может быть nil?

У меня есть одно приложение в мае, которое всегда nil, даже если я воссоздаю все с нуля (объявление иконтроль).

Ответы [ 6 ]

4 голосов
/ 03 июня 2011

Возможно, ваш перо испорчено, но я нахожу общую причину в двух случаях, когда вы думаете, что у вас есть только один, и тот, который вы используете в своем коде, не тот, который вы подключили.*

2 голосов
/ 03 июня 2011

Если вы также определили метод loadView, который создает представление, это возможно в зависимости от того, как вы его инициализируете. Если вы инициализируете его, используя alloc-init, и имя пера не совпадает с именем класса, то вы можете иметь случай, когда розетка равна нулю. Но ответ Чака кажется более разумным.

1 голос
/ 25 июня 2013

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

0 голосов
/ 23 июля 2015

Вы делаете что-то необычное с владельцем файла? Если вы не находитесь в одной из ситуаций, когда перо загружается автоматически (основной перо загружается приложением или перо загружается контроллером представления, документом или контроллером окна), тогда вам нужно загрузить перо программно .

0 голосов
/ 26 сентября 2011

Используете ли вы UINavigationController?
Если это так, откройте свой MainWindow.xib в IB и убедитесь, что имя пера вашего корневого контроллера задано правильно в Инспекторе атрибутов.установить правильно?Одна из причин заключается в том, что рефакторинг 'rename' не обновляет это, и тогда внутренние устройства не найдут перо, с которым можно связать ваш пользовательский интерфейс.Или вы сами переименовали перо и не обновили это поле.

0 голосов
/ 05 июня 2011

Одна возможность: предположим, что контейнер IBOutlet представляет собой одноэлементный объект с такой функцией:

+ (singletonObject*) sharedInstance {
    if(!gGlobalSingletonPointer) {
        gGlobalSingletonPointer = [[singletonObject alloc] init];
    }

    return gGlobalSingletonPointer;
}

Вы создаете одноэлементный объект «по требованию», если он еще не существует.Вы сохраняете глобальный указатель на него при его создании в этой функции.

Если вы также создадите экземпляр такого объекта в InterfaceBuilder и подключите его выходы, этот объект будет создан без sharedInstance вызывается.Если впоследствии вы вызовите sharedInstance, будет создан новый объект (без подключений IBOutlet).

Решение состоит в том, чтобы обновить глобальный указатель в функции inittonbject или функции awakeFromNib.

...