我想知道如何在发布通知时调用另一个类中的选择器。我在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
;
请告诉我,这可能吗?我怎么能这样做?
非常感谢
答案 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
。
<强>结论强>
根据OOP
和MVC
的精神,最好将购买回调分离为可用于每个独立视图控制器的第三类。
答案 1 :(得分:0)
如果您的视图控制器是标签栏控制器的根源,那么第一次加载它们时,除非手动更换,否则它们会保持不变。
因此,当您在第一个控制器中安装通知处理程序时,除非您删除通知处理程序,否则它仍会获取它们,即使第二个控制器在屏幕上也是如此。
现在,由于内存压力或自定义标签栏控制器代码,它可能会被卸载。但是,标签栏控制器取消分配其中一个视图控制器是非常不寻常的,因此您安装的通知处理程序将会一直存在,直到您取消它们为止。
事实上,如果两个视图控制器都注册了通知,那么他们都会获得通知。
您正在viewDidLoad
注册,因此第一个将立即注册,因为它将被加载并显示为初始控制器。它将继续收到这些通知。
当第二个加载时,它也会注册。现在两个视图控制器都在接收通知。当您返回第一个视图控制器时,它们仍然会收到通知。