IBOutlets в Swift - ноль

(Разработка на OSX 10.9, Xcode 6.1b)

Если я объявляю IBOutlets в своем AppController, все в порядке. Я создаю экземпляр объекта в InterfaceBuilder, перетаскиваю его, чтобы сформировать выход, и к тому времени, когда я достиг приложения applicationDidFinishLaunching, мои IBOutlets заполнены и все отлично.

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

Я могу установить соединение просто отлично, IB кажется убежденным, что он существует, список "ссылочных точек" верен, но этого не требуется, и я не смог найти что-либо в документации за пределами

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

Хорошо, я предполагал это.

Весь мой код - это предложения шаблонов Xcode:

@IBOutlet weak var sceneController: NSArrayController!

и я проверил и дважды проверил и проверил тройные проверки соединений. Я просмотрел десятки учебных пособий iOS (хотя я не могу найти эквивалент для OSX), все из которых, похоже, являются вариантами темы "да", вы можете полностью объявить выход в файл, отличный от AppController, просто убедитесь, что что каждый задействованный экземпляр существует ".

(На момент написания документа в документации "mac" использовались примеры с использованием UIButton и т.д.)

У меня нет идей. Очевидно, что соединение не сформировано, по-видимому, потому, что объекты создаются в порядке, отличном от "класса контроллера сначала, IBOutlets позже", но как я могу заставить это соединение?

Ответ 1

@IBOutlet weak var sceneController: NSArrayController!

Ключевое слово weak - ваша проблема. Если после завершения декодирования вашего декодера ничто не ссылается на NSArrayController, система сразу же установит выход на nil и освободит NSArrayController.

Попробуйте удалить ключевое слово weak из своих торговых точек.

UPDATE

Добавьте этот код:

@IBOutlet var sceneController: NSArrayController! {
    didSet {
        NSLog("sceneController set to %@", sceneController);
    }
}

Какой результат? Поместите точку останова на NSLog. Что трассировка стека при ударе? Повторяется ли он?

Ответ 2

У меня была аналогичная проблема

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

Решение заключалось в том, чтобы дождаться выхода обработчика кнопки, а затем внести изменения в компоненты GUI во втором представлении (попробуйте функцию viewDidLoad() на втором контроллере представления). Предположительно, эти компоненты GUI не были выделены до тех пор, пока я не оставил обработчик и не переключил представления.

yuen helbig