Bezdepbonusu7Программирование: статьи и ответы

Вопрос

IOS 6 Storyboard Segue со стилем Popover с целевой UIPopoverController вылетает

Автор вопроса: NektariosОтветов: 1

У меня есть приложение для iPad с основным ViewController, и внутри него есть UIButton. Это связано с переходом к стилю Popover с целью, которая является классом UIPopoverController (пустым, из Xcode "создать новый" с подклассом UIPopoverController).

Когда я нажимаю кнопку, запускается переход и происходит сбой:

2012-12-22 16:58:57.275 iAmFrustratedApp[11521:c07] -[MyGreatPopoverController initWithCoder:]: unrecognized selector sent to instance 0x1caabe70
2012-12-22 16:58:57.277 iAmFrustratedApp[11521:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MyGreatPopoverController initWithCoder:]: unrecognized selector sent to instance 0x1caabe70'
*** First throw call stack:
(0x22fe012 0x148fe7e 0x23894bd 0x22edbbc 0x22ed94e 0x5f3ae9 0x702a02 0x7020e5 0x5f367b 0x702a02 0x702418 0x7020e5 0x5f2aa3 0x81e48a 0x81ea83 0x81eb54 0x14a3705 0x3da920 0x3da8b8 0x49b671 0x49bbcf 0x49ad38 0x40a33f 0x40a552 0x3e83aa 0x3d9cf8 0x1bacdf9 0x2281f3f 0x228196f 0x22a4734 0x22a3f44 0x22a3e1b 0x1bab7e3 0x1bab668 0x3d765c 0x1cbd 0x1be5)
libc++abi.dylib: terminate called throwing an exception

Интересно, что раньше у меня эта цель была обычным UIViewController. Когда это был этот класс, это работало правильно, за исключением того, что я никак не мог программно закрыть всплывающее окно. Это единственная причина, по которой я переключил целевой класс на UIPopoverController.

  • Похоже, вы установили класс чего-то на MyGreatPopoverController в раскадровке. UIPopoverController не соответствует NSCoding CodaFi 23.12.2012
  • Правильно - я установил класс, который действует как то, что находится внутри всплывающего окна. Раньше это был подкласс UIVC, который я создал в IB. Затем я перешел к определению класса и изменил: UIViewController на: UIPopoverController. Это источник моего горя? Почему это не сработает? Nektarios 23.12.2012
  • Это не сработает, потому что UIPopoverController не может быть создан из NIB (именно поэтому я сделал эту шутку о NSCoding, вот и вся причина, по которой существует протокол: разархивировать объекты из перьев) CodaFi 23.12.2012

iosuistoryboarduipopovercontroller

Ответы

Ответ 1 · рейтинг 2 · sergio

Из Ссылка на протокол NSCoding :

Протокол NSCoding объявляет два метода, которые должен реализовать класс, чтобы экземпляры этого класса можно было кодировать и декодировать. Эта возможность обеспечивает основу для архивирования (когда объекты и другие структуры хранятся на диске) и распределения (когда объекты копируются в разные адресные пространства).

Кодировщик инструктирует объект сделать это, вызывая encodeWithCoder: или initWithCoder :. encodeWithCoder: инструктирует объект кодировать его переменные экземпляра в предоставленный кодировщик; объект может получать этот метод любое количество раз. initWithCoder: указывает объекту инициализировать себя на основе данных в предоставленном кодере; как таковой, он заменяет любой другой метод инициализации и отправляется только один раз для каждого объекта. Любой объектный класс, который должен быть кодируемым, должен принять протокол NSCoding и реализовать его методы.

Файл xib - это просто архив, состоящий из закодированных объектов. Когда вы загружаете xib, платформа декодирует их обратно (через initWithCoder) в объекты, которые заполняют ваше приложение.

Теперь случается, что UIPopoverController не соответствует протоколу NSCoding (см. справочный документ, только в начале, где сказано: Соответствует: там нет NSCoding.)

Но:

Любой объектный класс, который должен быть кодируемым, должен принимать протокол NSCoding и реализовывать его методы.

Следовательно, когда фреймворк находит вам UIPopoverController экземпляр производного класса и пытается его декодировать, он терпит неудачу.

Надеюсь, это проясняет это.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы