Несколько навигационных контроллеров, метод вызова в текущем topViewController

Вопрос в названии. Я написал «topViewController», чтобы обозначить полноэкранный вид, на который в данный момент смотрит пользователь. Я ищу общий способ сделать это из делегата приложения, независимо от того, использует ли приложение 0, 1 или несколько навигационных контроллеров.

Я могу решить это для текущего приложения, но с кодом особого случая. Иногда вы хотите поместить общий метод в делегат приложения и вызвать обратный вызов. Я мог бы использовать responsesToSelector, но тогда у него был бы (для меня) уродливый поиск для методов обратного вызова с индивидуальными именами.

Для меня это просто интересный вопрос (конечно, работающее приложение должно знать!), и общее решение было бы неплохо иметь в своем арсенале.


person Henrik Erlandsson    schedule 09.04.2013    source источник


Ответы (1)


У вас есть ссылка на навигационный контроллер в App Delegate, содержащий контроллер верхнего представления, для которого вы хотите вызвать метод? Если это так, UINavigationController имеет член с именем topViewController. Вы можете применить это к своему собственному классу контроллера представления:

CustomViewController *customController = (CustomViewController *)[aNavController topViewController];
[customController myCustomMethod];

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

Если нет, другим подходом может быть использование NSNotificationCenter. Зарегистрируйте собственное имя уведомления в «topViewController» и опубликуйте это уведомление из своего делегата приложения. Если вы зарегистрируетесь для получения уведомления на каждом контроллере представления, когда оно станет видимым, и отмените регистрацию, когда оно исчезнет, ​​только видимый контроллер представления получит уведомление:

Зарегистрируйтесь, в вашем случае, наверное, в viewDidAppear:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myCustomMethod:) name:@"MyCustomNotification" object:nil];

Разместите уведомление от вашего делегата приложения:

[[NSNotificationCenter defaultCenter] postNotificationName:@"MyCustomNotification" object:myAccount];

Не забудьте удалить наблюдателя в viewDidDisappear:

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"MyCustomNotification" object:nil];
person daltonclaybrook    schedule 09.04.2013
comment
Несколько навигационных контроллеров. Или у него может быть только Tabcontroller и не нужны Navcontrollers. - person Henrik Erlandsson; 10.04.2013