Arhn - архитектура программирования

Делегирование из вложенного стека навигации

У меня есть стандартный контроллер представления, выступающий в качестве делегата для модального контроллера представления над ним. Этот контроллер модального представления содержится в контроллере навигации.

После представления модального окна и добавления другого контроллера представления в стек навигации я хочу передать некоторые данные обратно в начальный контроллер представления делегата (который представил модальное окно).

Должен ли я сначала передать сообщение обратно по навигационному стеку в корневой контроллер представления модального навигационного контроллера и просто использовать методы делегата этого контроллера?

OR

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

@property (nonatomic, weak) id delegate;

вместо

@property (nonatomic, weak) id <NestedViewDelegate> delegate;

в противном случае я получаю ошибку несовместимого типа при передаче делегата из контроллера предварительного просмотра в стеке:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

{

NestedViewController *nest = [[NestedViewController alloc] init];

// @property id <RootViewControllerDelegate> delegate
[nest setDelegate:[self delegate]];

[[self navigationController] pushViewController:nest animated:YES];

}

Какова наилучшая практика для такого сценария?

Спасибо

31.10.2011

  • Привет, Кэмерон, тебе удалось реализовать решение? Как вы решили эту проблему? Я ищу решение, потому что у меня такая же проблема. 15.05.2012
  • Я думаю, уведомления проще всего. 15.05.2012

Ответы:


1

Я бы рассмотрел возможность использования уведомлений, чтобы отделить это. Оформить заказ NSNoticiationCenter.

Вы регистрируетесь на уведомление в своем корне и публикуете в своем дочернем элементе.

http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/nsnotificationcenter_Class/Reference/Reference.html

ПРИМЕР

В вашем дочернем объекте вы делаете что-то вроде этого:

[[NSNotificationCenter defaultCenter] postNotificationName:kMyNotificationName object:self userInfo:@{ @"key" : @"value" }]];

kMyNotificationName определяется в общем месте, таком как pch или Constants.h.

В корне вы должны делать что-то подобное либо в init, либо, возможно, всякий раз, когда вы нажимаете дочерний элемент.

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myNotificationName:) name:kMyNotificationName object:nil];

Не забудьте удалить наблюдателей в файле Dealloc или при извлечении дочернего элемента.

[[NSNotificationCenter defaultCenter] removeObserver:self kMyNotificationName object:nil];

Теперь вы можете обработать уведомление примерно так:

- (void)myNotificationName:(NSNotification *)note
{
     NSDictionary *userInfo = [note userInfo];

     // Do stuff using the information passed in.
}
31.10.2011
  • Эй, Кэмерон, удалось ли вам внедрить это решение? Как вы решили эту проблему? Я ищу решение, потому что у меня такая же проблема. 15.05.2012
  • Чтобы узнать об изменениях в контроллерах представлений глубоко в стеке навигации, использование делегирования и его резервного копирования является громоздким. Я настоятельно рекомендую использовать уведомления. 18.05.2012
  • @logancautrell Привет, не могли бы вы отредактировать свой пост для фрагмента кода о том, как зарегистрировать это уведомление и опубликовать его в дочернем, пожалуйста? Я столкнулся с той же проблемой :( 01.04.2013
  • Конечно, дай мне пару минут :D 01.04.2013
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..