2013-08-29 4 views
2

У меня возникли проблемы, реализующий связь по протоколу и делегат, описанный в этой статье: Passing Data between View ControllersРеализация делегата и протокол для передачи данных между видами

В разделе «Передача данных Назад», # 6 говорит:

Последнее, что нам нужно сделать, это показать ViewControllerB, что ViewControllerA является его делегатом, прежде чем мы нажимаем ViewControllerB на nav stack.

ViewControllerB *viewControllerB = [[ViewControllerB alloc] initWithNib:@"ViewControllerB" bundle:nil]; 
    viewControllerB.delegate = self; 
    [[self navigationController] pushViewController:viewControllerB animated:YES]; 

Можете ли вы помочь мне описать, где эта последняя часть кода идет? Я пробовал и пробовал, и читал весь пост много раз и, похоже, не могу понять это, не получив нескольких ошибок. Спасибо за вашу помощь.

Обновление: Я разместил код в методе viewDidLoad в моем ViewControllerB (ребенка) эквивалентны, и получил эти ошибки ::

  • Нет видимых @interface для «ViewControllerB» не декларирует селектор «initWithNib: расслоение: '
  • выражение Индексирование является недействительным, поскольку тип подстрочный „пустота“ не тип указателя интеграла или Objective-C
+0

Опубликуйте свои ошибки, потому что есть много, что может пойти не так. – Tony

+0

отредактировал мой ответ для получения большей ясности – Justin

ответ

2

Не ставьте код в ViewControllerB класса, что приведет к recursive loop. Это цикл, который вызывает себя, увековечивая цикл. Внутри viewDidLoad код запускается при загрузке представления. Таким образом, вы загружаете представление, затем создаете новый объект ViewControllerB и загружаете его, что в свою очередь создает ViewControllerB ...

Попробуйте поместить этот код в класс ViewControllerA, внутри -viewDidAppear.

Каждый раз, когда вы возвращаетесь, код будет выполняться снова, создавая новый ViewControllerB и нажав на стек.

Посмотрите на последнее сообщение, которое я сделал в своем блоге, http://appsylvania.com.Речь идет о понимании делегатов, использующих реальную мировую аналогию. Я уточню это позже с правильным URL точного сообщения.

EDIT: также вы хотите знать, что такое специальное ключевое слово self. Это похоже на this в JavaScript. Когда вы используете self, вы делаете ссылку на текущий класс , вы находитесь в. Итак, если вы работаете в .m файле ViewControllerB, и вы вводите self, то self == instance of ViewControllerB. Вы изначально сказали, что пытаетесь сделать ViewControllerA делегатом B. В этом случае вы делаете свой текущий экземпляр ViewControllerB делегатом из нового экземпляра ViewControllerB.

+0

Очень полезно. Спасибо. Вместо того, чтобы я использовал VewControllerB? Я хочу, чтобы VIewControllerB был ребенком ViewControllerA – Craigvu

+0

Трудно объяснить в комментарии, но я бы хотел написать сообщение в блоге об этом. Вы хотите, чтобы '* экземпляр 'ViewControllerA был делегатом ViewControllerB. Когда вы находитесь внутри 'viewDidLoad' вашего файла ViewControllerA.m, использование' self' является ссылкой на сам экземпляр, после его выделения и создания экземпляра. Большой камнем преткновения является понимание концепции объектно-ориентированного программирования классов и экземпляров. Короче говоря, класс похож на план небоскреба, а небоскреб - пример проекта. У вас может быть много зданий из одного набора планов. – Justin

+0

Итак, каждый раз, когда вы вводите 'ViewControllerA * viewA = [[ViewControllerA alloc] init];' вы создали новый экземпляр. Вы используете класс (план) для создания экземпляра (небоскреб). Я не знаю, что я пытаюсь понять, кроме этого все будет греческим для вас, если вы действительно не поймете, как работает объектно-ориентированное программирование (ООП). Если вы можете понять концепцию, вы можете, скорее всего, сделать свой путь на любом языке ООП, если вы знаете синтаксис – Justin

1

Th Все дело в том, что viewControllerA является CREA ting и показ viewControllerB. Однако это делается независимо от того, выполняется ли segue или создается явно из NIB, делегат устанавливается сразу после создания viewControllerB` и перед его отображением.

2

Нет видимых @interface для 'ViewControllerB' объявляет Селектор 'initWithNib: сверток:'

Проблема здесь в том, что вы вызываете неправильный метод. Метод UIViewController является initWithNibName:bundle:

0
  1. селектора initWithNib:bundle: действительно неправильно. Если вы посмотрите на документацию UIViewController, вы увидите, что она должна быть initWithNibName:bundle:.

  2. Вы опустили точку с запятой после viewControllerB.delegate = self.

Смежные вопросы