2

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

,FirstViewController标签栏SecondViewController项目

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 方法

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

非常感谢

4

2 回答 2

1

在将asSecondViewController更改为的指针时,因为 的实例具有方法。selfobserverFirstViewControllerFirsViewController

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];
}

但!这就是重点。

如果FirstViewController已经使用上述方法在内存中有效且已加载的视图控制器,并且它已经是 中这些通知的观察者NSNotificatioCenter,则无需再次将其添加到 中,NSNotificationCenter因为FirstViewController可以接收并且仍然会收到所需的通知。(它只是没有显示,因为另一个视图控制器覆盖了它。)

如果FirstViewControlleris 时 is 还不存在SecondViewController,则无法访问从另一个类调用的任何实例方法,因为FirstViewController之前未实例化,并且您也无法将其添加到 theNSNotificationCenter中。

结论

OOP根据and的精神,最好将购买回调隔离到可用于每个独立视图控制器的第三类中MVC

于 2012-08-18T07:46:43.377 回答
0

如果您的视图控制器是标签栏控制器的根,那么一旦它们第一次加载,它们就会一直存在,除非手动替换。

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

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

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

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

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

于 2012-08-18T06:54:52.900 回答