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

У меня есть приложение для 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.


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


Ответы (1)


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

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

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

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

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

Но:

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

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

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

person sergio    schedule 22.12.2012
comment
Серджио, спасибо, но как я могу убрать UIViewController внутри всплывающего окна? Я пробовал несколько подходов (уволить себя, уволить из вызывающей VC) безуспешно. Это было единственной причиной, по которой я пытался использовать UIPopoverController. Верно ли утверждение, что я не должен использовать UIPopoverController, если я использую переходы в стиле всплывающего окна? Я понимаю, что задаю несколько иной вопрос, чем в исходном сообщении - person Nektarios; 23.12.2012
comment
Я нашел этого S.O. вопрос, который, кажется, дает точный рецепт того, что вы пытаетесь выполнить: stackoverflow.com/questions/8287242/ - person sergio; 23.12.2012