0

我正在编写一个应用程序,让用户知道他们每天在同一时间等待新的提示。如果应用程序在前台运行,我已经能够安排通知并编写代码以触发它。我遇到的问题是当应用程序在后台时如何让同样的事情发生。复杂之处在于我正在根据通知本身设置视图(哪些按钮可见等),因为下一步是有第二个通知,该通知将使视图设置不同。目前,我在方法中的代码如下所示:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:
  (NSDictionary *)launchOptions
  {
   // Override point for customization after application launch.
    UILocalNotification *note = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
    NSString *val = [note.userInfo objectForKey:1];
    if ([val isEqual: @"first"]) {

    }

    return YES;
}

我的问题是我不知道如何在 if 语句中设置视图(即如何使两个按钮 [称它们为 button1 和 button2] 在视图中可见)。任何答案将不胜感激,如果这是令人难以置信的显而易见的事情,那么我道歉并只要求有人至少指出我正确的方向。谢谢

4

2 回答 2

0

我将尝试为您的问题提供更一般的答案:iOS 编程基于 MVC(模型-视图-控制器)软件架构模式,因此您必须使您的应用程序尽可能地与 MVC 兼容。这意味着,在您的情况下,一旦您收到本地通知,无论您的应用程序是在前台运行还是在后台休眠,或者只是准备从头开始启动,如果 MVC 砖块,应用程序的行为方式都相同设置正确。

所以:

  • 本地通知为应用程序提供了一些新数据,因此您必须更新模型
  • 更新模型后,您会通知应用程序视图控制器模型更改
  • 视图控制器(如果可见)将反映代表模型的视图中的更改,如果不可见,您的应用程序必须显示视图控制器,然后根据模型状态刷新视图。

显然,如何做到这一点取决于您的应用程序显示不同视图的方式和位置,但为了简单起见,您可以:

  • 创建在启动时反映本地通知的模型(application:didFinishLaunchingWithOptions:)
  • 创建在启动时显示本地通知数据的视图控制器(注意:您通过提供模型“初始化”视图控制器,您还不关心视图)
  • 然后在模型和视图控制器初始化后处理本地通知

因此,当您收到应用程序的本地通知时:

  • 更新模型(当应用程序处于前台或从睡眠状态恢复或从头开始时,这在所有三种情况下都存在)
  • 此时,如果视图控制器视图已经可见,那么您只需使用新模型数据刷新它,如果不可见,则在视图层次结构中添加视图控制器视图(例如,通过将其推送到主导航控制器堆栈中);视图刷新将由 viewDidLoad 完成:

如您所见,您不需要任何特殊代码来管理它,除了需要在应用程序收到通知时显示本地通知相关视图。显然,如果您的本地通知视图在您的视图层次结构中很深,并且您必须保持一些一致性,那么事情就会复杂得多:在这种情况下,您必须重建整个层次结构,并且这样做的可能性取决于本地通知提供的信息。在简单的情况下,当您可以将本地通知视图控制器放在主窗口层次结构中时,在实例化主导航控制器后: [applicationWindow setRootController:mainNavigationController] 您将在导航控制器堆栈中推送本地通知控制器: [mainNavigationController pushViewController:myLocalNotificationViewController 动画:YES]

抱歉,如果我没有详细说明您的具体问题(我不能),但我的解释可能会帮助您了解您的情况不是特殊情况,但可以通过仔细遵循主要的 iOS 架构模式轻松管理.

于 2013-05-25T13:02:10.437 回答
0

不是100%,但相信

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:
  (NSDictionary *)launchOptions

在开始加载视图之前完成,这样更有意义。

考虑到这一点,并被我成功使用,我建议您在应用程序委托上设置一个公共 var 来存储您需要的信息。

之后只是检查

- (void)viewDidLoad

如果将 var 视为任何内容,则查看您的 viewController,并像应用程序在前台时一样对待信息。

于 2013-05-25T12:23:24.323 回答