从AppDelegate更改选项卡和推送视图

时间:2012-04-22 11:28:21

标签: objective-c ios xcode uinavigationcontroller uitabbarcontroller

我的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]:发送到的无法识别的选择器   实例

1 个答案:

答案 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不会触发表委托方法,所以你必须自己调用。