从另一个类 - NSNotificationCenter调用Selector方法

时间:2012-08-18 05:16:21

标签: iphone ios ios4 nsnotificationcenter

我想知道如何在发布通知时调用另一个类中的选择器。我在tabbarcontroller上。

FirstViewControllerSecondViewController标签栏项目

Inside `FirstViewController` I have the following

-(void)viewdidload
{
  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(productPurchased:)   name:kProductPurchasedNotification object:nil];

  [[NSNotificationCenter defaultCenter] addObserver:self selector: @selector(productPurchaseFailed:) name:kProductPurchaseFailedNotification object: nil];

}

- (void)productPurchased:(NSNotification *)notification {

    [NSObject cancelPreviousPerformRequestsWithTarget:self];

    NSString *productIdentifier = (NSString *) notification.object;
    NSLog(@"Purchased: %@", productIdentifier);

    [appDelegate.myDownloadablePoemsArray addObject:productIdentifier];
    [self.tabBarController setSelectedIndex:3];
}

- (void)productPurchaseFailed:(NSNotification *)notification {

    [NSObject cancelPreviousPerformRequestsWithTarget:self];

    SKPaymentTransaction * transaction = (SKPaymentTransaction *) notification.object;    
    if (transaction.error.code != SKErrorPaymentCancelled) {    
        UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Error!" 
                                                         message:transaction.error.localizedDescription 
                                                        delegate:nil 
                                               cancelButtonTitle:nil 
                                               otherButtonTitles:@"OK", nil] autorelease];

        [alert show];
    }

}

上面的代码工作正常。现在问题是,我想从我的另一个视图中调用相同的选择器方法,例如我有一个名为SecondViewController的视图控制器,因为我添加了相同的通知观察器。

但未在FirstViewController

中调用选择器方法

SecondViewController内我有以下

-(void)viewdidload
{
  [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(productPurchased:)   name:kProductPurchasedNotification object:nil];

  [[NSNotificationCenter defaultCenter] addObserver:self selector: @selector(productPurchaseFailed:) name:kProductPurchaseFailedNotification object: nil];

}

但我想从FirstViewController;

调用selecor方法

请告诉我,这可能吗?我怎么能这样做?

非常感谢

2 个答案:

答案 0 :(得分:1)

SecondViewController中的

self更改为observer FirstViewController的指针,因为FirsViewController的实例具有方法。

SecondViewController.m 中,您必须使用以下行:

- (void)viewdidload {
  [[NSNotificationCenter defaultCenter] addObserver:firstViewController selector:@selector(productPurchased:)   name:kProductPurchasedNotification object:nil];
  [[NSNotificationCenter defaultCenter] addObserver:firstViewController selector: @selector(productPurchaseFailed:) name:kProductPurchaseFailedNotification object: nil];
}

<强> BUT!这就是重点。

如果FirstViewController已经是内存中有效且已加载的视图控制器,并且上面提到的方法已经存在,而NSNotificatioCenter中已经是这些通知的观察者,那么我需要再次将其添加到NSNotificationCenter,因为FirstViewController可以接收并仍会收到所需的通知。 (它只是没有显示,因为其他视图控制器覆盖它。)

如果在FirstViewController之后SecondViewController尚未存在,则无法访问从另一个类调用的任何实例方法,因为FirstViewController之前没有实例化,并且您无法添加它也是NSNotificationCenter

<强>结论

根据OOPMVC的精神,最好将购买回调分离为可用于每个独立视图控制器的第三类。

答案 1 :(得分:0)

如果您的视图控制器是标签栏控制器的根源,那么第一次加载它们时,除非手动更换,否则它们会保持不变。

因此,当您在第一个控制器中安装通知处理程序时,除非您删除通知处理程序,否则它仍会获取它们,即使第二个控制器在屏幕上也是如此。

现在,由于内存压力或自定义标签栏控制器代码,它可能会被卸载。但是,标签栏控制器取消分配其中一个视图控制器是非常不寻常的,因此您安装的通知处理程序将会一直存在,直到您取消它们为止。

事实上,如果两个视图控制器都注册了通知,那么他们都会获得通知。

您正在viewDidLoad注册,因此第一个将立即注册,因为它将被加载并显示为初始控制器。它将继续收到这些通知。

当第二个加载时,它也会注册。现在两个视图控制器都在接收通知。当您返回第一个视图控制器时,它们仍然会收到通知。