为什么我不能从另一个类调用方法?

时间:2013-11-04 08:03:30

标签: ios objective-c

我正在尝试从“IAPHelper”调用“SettingsViewController”中的方法。

在寻找答案后,我想我已经掌握了如何做到这一点。这就是我所做的:

SettingsViewController.h

@interface SettingsViewController : UITableViewController

- (void)stopActivityIndicatorAnimating;

SettingsViewController.m

- (void)stopActivityIndicatorAnimating
{
// DO STUFF
}

IAPHelper.h

#import "SettingsViewController.h"

IAPHelper.m

SettingsViewController *settingsViewControllerInstance = [[SettingsViewController alloc] init];
[settingsViewControllerInstance stopActivityIndicatorAnimating];

现在,我一直在寻找那些遇到同样问题的人,但对我来说,解决方案看起来都像我在做什么!

我遇到的问题是没有错误,代码应该执行(我已经添加了一个NSLog)但是它应该调用的方法中的代码不会发生。它只是默默地不这样做。

有人可以告诉我,如果我错过了一些东西,完全错了(最有可能),或者它真的应该有效,我在其他地方做错了,在这种情况下,我会让你一个人

谢谢!

3 个答案:

答案 0 :(得分:4)

在您的IAPHelper中,您正在创建一个新的viewContorller。这是您发送stopActivityIndi​​catorAnimating消息的对象。由于此viewControllers视图可能不在可见的viewHierarchy中,因此您将看不到任何效果。 解决这个问题的方法有一个更好的设计,例如:让您的IAPHelper发出合适的NSNotification。然后viewCotroller可以观察此通知并对其进行操作(即打开或关闭activityMonitor)。 由于您的IAPHelper很可能是数据层类型的对象,因此您不希望将其耦合到viewController,因为这将导致非常严格的设计,这样的问题变得更加频繁和困难。

答案 1 :(得分:2)

我建议使用NSNotification。

在您的IAPHelper.m中发送通知:

[[NSNotificationCenter defaultCenter] postNotificationName:@"StopAnimating"
                                                    object:self];

在您的SettingsViewController.m viewDidLoad方法中执行:

[[NSNotificationCenter defaultCenter] addObserver:self
                                     selector:@selector(stopActivityIndicatorAnimating)
                                         name:@"StopAnimating"
                                       object:nil];

使用此代码,将从IAPHelper类内部向SettingsViewController类发送通知,其中将调用stopActivityIndi​​catorAnimating方法。

答案 2 :(得分:0)

正如其他答案所示,您可以拥有比此更好的设计。

从上面的代码我感觉到,你已经在对象A中创建并启动了动画并尝试创建对象B并在对象B中执行停止动画方法。你应该传递对象的正确引用(对象的引用) A)到IAPHelper并从该对象调用停止动画。

你的IAPHelper应该是这样的

<强> IAPHelper.h

#import "SettingsViewController.h"
@property (nonatomic, strong)SettingsViewController *settingsViewControllerInstance;

<强> IAPHelper.m

[self.settingsViewControllerInstance stopActivityIndicatorAnimating];