3

我的 AppDelegate 中有一个名为 handleLocalNotification 的方法,当我的应用收到通知时会触发该方法。我需要它切换到包含 UITableview 的 UITabBarController 中的选项卡 0。然后我需要它推送表格视图的正确行以显示通知发送的记录。所有控制器都是在情节提要中创建的,所以我在 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]:发送到实例的无法识别的选择器

4

1 回答 1

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

于 2012-04-22T11:58:22.910 回答