我的AppDelegate中有一个名为handleLocalNotification的方法,当我的应用收到通知时会触发该方法。我需要它切换到包含UITableview的UITabBarController中的tab 0。然后我需要它来推送tableview的正确行以显示通知发送的记录。所有控制器都在故事板中创建,因此我在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位有效,因为我可以在不同的选项卡上加载它。最后两行导致它崩溃。我是否以正确的方式解决了这个问题?或者我需要使用不同的方法吗? 崩溃的原因是:
UINavigationController tableView]:发送到的无法识别的选择器 实例
答案 0 :(得分:6)
我建议使用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不会触发表委托方法,所以你必须自己调用。