3

У меня есть метод, называемый handleLocalNotification в моем AppDelegate, который запускается, когда мое приложение получает уведомление. Мне нужно, чтобы он переключился на вкладку 0 в моем UITabBarController, который содержит UITableview. Затем мне нужно, чтобы он нажал на правильную строку таблицы, чтобы показать запись, отправленную уведомлением. Все контроллеры создаются в раскадровке, поэтому у меня нет ссылок на них в AppDelegate.Изменить вкладку и нажать вид из AppDelegate

Я добавил к моему AppDelegate.h:

@class MyListViewController; 
@interface iS2MAppDelegate : UIResponder <UIApplicationDelegate> { 

    MyListViewController *_listControl; 

} 

и для тестирования я просто положить это в методе didFinishLaunchingWithOptions:

UITabBarController *tabb = (UITabBarController *)self.window.rootViewController; 
    tabb.selectedIndex = 0; 
    _listControl = [tabb.viewControllers objectAtIndex:0]; 
    [_listControl.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:4 inSection:0] animated:YES scrollPosition:UITableViewScrollPositionTop]; 

Бит tabBarController работает, как я могу получить он загружается на разные вкладки. Последние 2 строки приводят к сбою. Понял ли я об этом правильно? Или мне нужно использовать другой метод? Причина аварии является:

UINavigationController Tableview]: непризнанные селектор направлен например

ответ

5

я предлагаю использовать NSNotificationCenter попробовать сделать это как этот

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification 
{ 
    UITabBarController *tabb = (UITabBarController *)self.window.rootViewController; 
    tabb.selectedIndex = 0; 
[[NSNotificationCenter defaultCenter] postNotificationName:@"localNotificationReceived" object:nil]; 
} 

и в вашем ViewController viewDidLoad

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

теперь вы можете использовать ваш Tableview и сделать ваши вещи

-(void) selectRows 
{ 
    [tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:4 inSection:0] animated:YES scrollPosition:UITableViewScrollPositionTop]; 
} 

Чтобы программно выбрать ячейку, это может сделать работу:

NSIndexPath *selectedCellIndexPath = [NSIndexPath indexPathForRow:4 inSection:0]; 
[table selectRowAtIndexPath:selectedCellIndexPath 
        animated:YES 
      scrollPosition:UITableViewScrollPositionTop]; 
[table.delegate tableView:table didSelectRowAtIndexPath:selectedCellIndexPath]; 

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

+0

Спасибо. Это хороший способ обойти это, однако наблюдатель уведомления не вызывается, когда приложение полностью закрыто. Я предполагаю, что tableViewController не был загружен к моменту отправки postNotification. Если приложение просто подсвечено, оно работает. Кроме того, я ошибся, думая, что selectRowAtIndexPath фактически нажмет на меня строку, но это просто подчеркивает ее. Есть ли способ заставить его нажать конкретную строку, поэтому вызывается метод prepareForSegue? – Darren

+0

проверить мое редактирование пожалуйста. –

+0

Отлично, что должно стрелять в камеру. Как насчет того, когда приложение загружается первым, а наблюдатель не был настроен при его вызове? Могу ли я заставить его подождать и убедиться, что ViewDidLoad был вызван, прежде чем запускать уведомление? – Darren

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