可以对UILocalNotification进行子类化并更改默认的“关闭”按钮文本和方法吗?

时间:2011-12-20 19:21:03

标签: objective-c override subclass uilocalnotification

正在寻找一种方法来更改 UILocalNotification “关闭”按钮文字/功能...

我发现不可能从另一个对象访问/调用text / function,尽管子类化 UILocalNotification应该允许实现方法覆盖 ...更不用说创建访问者来获取/设置“关闭”按钮文本字段。

你们对此有何看法? Apple会怎样?

有人试过吗?...

编辑:12/21/2011 12:01 PM

我提出的问题涉及对oop的理解:延迟/早期绑定,动态方法查找,以及声明的类型与运行时类型字段和方法处理。

UILocalNotification的子类化确实工作......

UILocalNotificationExampleSubclass * example = [UILocalNotificationExampleSubclass init];

...设备确实创建一个对象,但类型为UILocalNotification而不是UILocalNotificationExampleSubclass

我正在寻找对UILocalNotification.m文件方法的深入了解。

如果没有拥有自己的方法,那么(名称请)对象采用UILocalNotification的实例,使用其字段,并显示对象 (请注明)我们在屏幕上看到了吗?

1 个答案:

答案 0 :(得分:9)

UILocalNotification只是通知信息的存储空间。它没有执行任何操作。

此外,您的应用程序不会显示通知。另一个过程呢。所以继承UILocalNotification只是没用。

编辑于12月22日,17:53 UTC + 1:

是的,您可以继承UILocalNotification。但UILocalNotification是一个抽象类,并且没有实现任何属性。覆盖alloc方法,因此它返回一个私有子类UILocalNotification的实例。这就是为什么你不能实例化UILocalNotificationExampleSubclass

但是,仍然没有指向子类UILocalNotification,因为当您使用-[UIApplication scheduleLocalNotification:]安排通知或使用-[UIApplication presentLocalNotification:]立即显示通知时,操作系统副本通知。

该副本存储在由系统管理的另一个进程中,该进程使用自己的私有存储机制。 UILocalNotification只是一大堆属性的存储,它们将被序列化并从应用程序发送到操作系统。

现在,我们有其他进程存储所有已调度的本地通知并等待触发通知。当发生这种情况时,该过程将检查您的应用程序是否在前台。

  • 如果您的应用程序不在前台,那么完全不受我们控制的其他进程将创建警报并显示通知。我们无法以任何方式自定义该警报,除非使用UILocalNotification类的属性。
  • 如果您的应用程序位于前台,则通知将发送回将创建UILocalNotification的新实例的应用程序。然后,UIApplication共享实例将访问其delegate属性并检查该委托是否实现application:didReceiveLocalNotification:。如果是,您将收到通知,并可以使用该通知执行任何操作。例如,您可以选择使用警报视图显示通知。

配置和显示警报视图可以这样完成:

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification
{
    UIAlertView *alertView =
    [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"Alert", nil)
                               message:NSLocalizedString(notification.alertBody, nil)
                              delegate:nil
                     cancelButtonTitle:nil
                     otherButtonTitles:NSLocalizedString(@"OK", nil), nil];
    [alertView show];
    [alertView release]; // unless your project uses Automatic Reference Counting
}

我希望这个更长的回答确实回答了你的问题,如果我说的是真的