Искал ответ на этот вопрос, но, похоже, не нашел окончательного решения - надеюсь, что кто-то может помочь здесь!

Я создаю мультипросмотровое приложение для iPhone. Я создал UIViewController под названием «MainViewController», который загружается в другие представления по мере необходимости. Существует довольно много навигации между экранами, поэтому я хотел бы иметь метод «ViewSwitcher» в MainViewController, который контроллеры дочерних представлений могут вызывать, чтобы попросить представление переключиться на другое дочернее представление.

Как я могу вызвать метод «ViewSwitcher» из дочерних контроллеров? В настоящее время мне удалось добиться этого, создав свойство UIView * "parent" в каждом контроллере дочернего представления и заполнив его при первой загрузке дочернего представления. Затем я могу вызвать метод, используя [parent ViewSwitcher]. Это кажется немного неуклюжим, и я обеспокоен тем, что создаю какую-то ужасно рекурсивную структуру. Есть ли способ лучше?

Заранее спасибо.

2
David F 24 Ноя 2009 в 03:03

2 ответа

Вот что-то, что выглядит неуклюжим, но должно продемонстрировать общую идею:

NSArray *viewControllerArray = [self.navigationController viewControllers];
int parentViewControllerIndex = [viewControllerArray count] - 2;
[[viewControllerArray objectAtIndex:parentViewControllerIndex] setBackBarButtonItemTitle:@"New Title"];

Многое из этого можно легко заменить макросом #define:

#define CurrentParentViewController [[self.navigationController viewControllers] objectAtIndex:[[self.navigationController viewControllers] count] - 2]

Затем вы можете использовать его следующим образом:

[CurrentParentViewController setBackBarButtonItemTitle:@"New Title"];

Это, очевидно, приведет к сбою, если вы вызовете это в самом нижнем контроллере представления в стеке навигации, но, по-видимому, вы будете знать, когда используете этот подход. Вы можете, например, вызвать [[self.navigationController viewControllers] count], чтобы убедиться, что вы можете запустить это.

3
Alex Reynolds 24 Ноя 2009 в 10:44
Большое спасибо за это. Если я правильно понимаю, вы поместите это в дочернее представление, и оно получит каждый контроллер представления, определенный родительским контроллером. Если я правильно понял - откуда ты знаешь, что это смещение на два? Не потому ли, что последняя запись будет (count-1) и будет соответствовать текущему представлению, а предпоследняя (count-2) будет его непосредственным владельцем? Большое спасибо за быстрый ответ!
 – 
David F
24 Ноя 2009 в 22:11
Индексы массива отсчитываются от 0: Array[0] — первый элемент, Array[1] — второй элемент и т. д. Индекс текущего контроллера представления будет (длина-1) индексом -viewControllers множество. Индекс родительского контроллера представления текущего контроллера представления будет иметь индекс (длина-2) массива -viewControllers.
 – 
Alex Reynolds
25 Ноя 2009 в 00:17

Вы можете создать одноэлементный объект. Эта статья о cocoawithlove великолепно раскрывает эту тему. .

0
Epsilon Prime 24 Ноя 2009 в 04:00
Очень признателен - у меня был трал, и, похоже, это имеет смысл. Я просто беспокоился о настройке указателей на родительское представление в каждой структуре представления! Большое спасибо!
 – 
David F
24 Ноя 2009 в 22:08