При настройке выхода необходимо одновременно выполнить несколько условий. Если вы не сделаете этого, то рано или поздно ваш выход станет работать неправильно.

Не обижайтесь и не бойтесь; будьте готовы! Это случается с каждым. Важно распознать симптомы, чтобы понять, в чем дело.

Неправильный класс источника

  • Начнем с примера Empty Window. Откройте раскадровку. Используя инспектор идентичности, измените класс контроллера представления в сцене на UlViewController. Запустите проект. На этапе выполнения программы вы получите сообщение об ошибке: “UlViewController . . . class is not key value coding-compliant for the key button” (“UlViewController ... — класс не соответствует правилам кодировки ключ-значение для ключа button”)
  • В результате ошибки бы создан экземпляр источника выхода, относящийся к неправильному классу: вместо экземпляра класса ViewController мы создали экземпляр класса UlViewController. Класс UlViewController, встроенный суперкласс класса ViewController, не имеет свойства button (в нем нет ни переменной экземпляра button, ни set-метода setButton:). Когда мы загрузим второй nib-файл, чтобы получить главное представление контроллера, он будет содержать выход с именем button. Во время выполнения программы система не найдет соответствующей цели для источника выхода — экземпляра класса UlViewController — и произойдет сбой программы.

 

В классе источника нет переменной экземпляра

  • Исправим ошибку, сделанную в предыдущем примере, используя инспектор идентичности, и изменим класс контроллера представлений в сцене, вернув имя ViewController. Запустим проект на выполнение, чтобы убедиться в успехе. Теперь закомментируем объявление 0property в файле ViewController.h и строку self .button в строке ViewController. ш. Запустим проект на выполнение. Во время выполнения приложения произойдет сбой: “ViewController ... class is not key value coding-compliant for the key button.” (“ViewController ... — класс не соответствует правилам кодировки ключ-значение для ключа button.”)
  • Очевидно, что это та же самая проблема, но в другом варианте. Мы правильно указали класс источника — ViewController. Однако мы создали выход button в nib-файле тайком от nib-редактора и удалили соответствующую переменную экземпляра в классе источника выхода. И снова при загрузке nib-файла система выполнения приложения не сможет найти цель для источника выхода — экземпляр класса ViewController — и произойдет сбой.

 

В nib-файле нет выхода

  • Исправим ошибку, сделанную в предыдущем примере, сняв символы комментария со строк, закомментированных в файле ViewController.h и ViewController.m. Запустим проект на выполнение, чтобы убедиться, что он работает. Теперь откроем раскадровку. Выберем контроллер представления и в инспекторе связей удалим связь выхода кнопки, щелкнув на букве X на левом конце второго закругленного прямоугольника. Запустим проект на выполнение. Приложение работает, но заголовок кнопки остается строкой “Howdy! ”, т.е. наша попытка изменить его на “Hi ! ” в методе viewDidLoad класса ViewController молча провалилась.
  • Это очень коварная и невероятно распространенная ошибка. Мы указали правильный класс объекта источника с правильной переменной экземпляра, и nib-редактор содержит выход, но сам выход не имеет объектов цели. В результате после загрузки nib-файлов значение переменной экземпляра button в объект источника будет равно nil. Мы можем ссылаться на переменную self .button, но она равна nil. Мы передаем ей сообщение setTitle : forState:, но это сообщение отправляется в пустоту. Сообщения, отправленные по адресу nil, не вызывают никаких ошибок, но при этом ничего не происходит (см. главу 3).

 

Отсутствует выход представления

  • На этот раз мы будем использовать пример Truly Empty, потому что редактор раскадровок для нашей цели не подходит. Откройте файл . xib в проекте Truly Empty. Выберите прокси-объект File’s Owner, перейдите в окно инспектора инспектора связей и отсоедините выход представления. Запустите проект на выполнение. Во время выполнения приложения произойдет сбой: “loaded the 'ViewController' nib but the view outlet was not set” (“загружен nib 'ViewController', но выход представления не задан”) .
  • В этом сообщении сказано все. Nib-файл, играющий роль источника главного представления контроллера, должен иметь выход представления, соединяющий контроллер (прокси-объект владельца nib-файла) с представлением.

 

Контроллер имеет выход представления, потому что свойство view представления класса UlViewController отмечено как outlet. К сожалению, вы не можете увидеть эту отметку. В документации о стандартных классах каркаса Cocoa ничего не говорится об их свойствах, которые могут быть выходами! В общем, единственный способ узнать, какие выходы есть во встроенном классе, — проверить один из таких классов в nib-редакторе.


 

 

 

Добавить комментарий