0

当我的应用收到通知时,它会像这样打开一个特定的视图来处理它:

    UILocalNotification *localNotif = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
    if (localNotif) {
        NSLog(@"Recieved Notification  didFinishLaunchingWithOptions %@",localNotif);
        [theLastPresentedViewController presentViewController:myVC animated:YES completion:nil];
    }

基本上我的问题是如何访问最后呈现的 ViewController theLastPresentedViewController以便我可以呈现myView在它之上?

虽然该应用程序使用 tabBarViewController 作为基础,但我将其他 viewController 呈现在其他视图之上,因此无法知道哪个 ViewController 已作为最后一个呈现。

我是否必须手动记住我呈现的每个 ViewController,所以当应用程序启动时我可以访问最后一个,或者有没有办法直接访问应用程序的最后一个可见的 viewController?

由于用户只需按下 HOME 按钮并退出应用程序,因此无法知道此时显示的是哪个视图。在到达 tabBarViewController 之前,从堆栈中关闭所有这些视图也是可以的。

非常感谢!

4

3 回答 3

2

在导航堆栈上执行“随机”推送基本上是一个坏主意。您可以呈现一个半模态或模态控制器作为对通知的反应,它通常不需要指向“顶部可见”视图控制器的指针。

或者,您可以允许您的视图控制器/视图接受第一响应者,例如:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self becomeFirstResponder];
}

- (BOOL)canBecomeFirstResponder
{
    return YES;
}

现在,您可以发送一个事件:

[[UIApplication sharedApplication] sendAction:@selector(popNotification) to:nil from:notificationObj forEvent:nil];

并且它将被分派给第一响应者(即任何焦点视图,并向下到视图控制器,因为视图无法处理自定义事件)。从这一点开始,您处于顶部可见视图控制器的上下文中,并且可以继续您的原始任务。

于 2012-08-16T13:11:15.620 回答
1

我发现这个可以访问最顶层的窗口/视图:

[[[UIApplication sharedApplication] keyWindow] addSubview:someView]
于 2012-08-24T07:56:56.277 回答
0
    - (void)applicationDidEnterBackground:(UIApplication *)application{
saveIndex = self.tabBarController.selectedIndex //shows the current index of the viewController of the Array of the tabBarController
    //add some stuff to save the integer}

您可以在用户退出应用程序并在应用程序变为活动状态后使用数组的此元素加载 tabBarController 时保存此整数

要打开保存的视图,请在 AppDelegate 中写入:

  - (void)applicationDidBecomeActive:(UIApplication *)application{
[self.tabBarController setSelectedIndex:savedIndex];}

这应该这样做

于 2012-08-16T13:07:34.407 回答