从另一个ViewController2.m文件中调用ViewController1.m中声明的方法

时间:2014-04-16 06:28:45

标签: ios methods instance

我在ViewController1.m中声明了我的方法'callWEBservice()',我想在ViewController2.m中调用。我在ViewController2.m中创建了ViewController1.m的对象:

 ViewController1* mainVC = [[ViewController1 alloc] init]; 

现在我试图调用该方法,但我无法做到。请帮忙解决这个问题,因为我是iOS的新手,我搜索了一些人说要使用代表。

3 个答案:

答案 0 :(得分:1)

您需要在.h文件中定义方法签名 -

 - (void) callWebService;

然后在.m文件中定义方法体:

- (void)callWebService
{
     // Whatever you need to do to call the web service
}

然后在ViewController2.m中,您可以#import "ViewController1.h"

现在您可以致电[mainVC callWebService];

但是您显示的代码会创建ViewController1的新实例 - 如果您已经有ViewController1的实例,例如应用中的主视图,那么这可能不是您想要的 - 您可能需要在ViewController2中设置属性并存储对ViewController1的引用

e.g。在ViewController2.h     #import“ViewController1.h”//或使用@class ViewController1指令

@property (strong,nonatomic) ViewController1 *mainVC;

然后在ViewController 1之前,在您出现ViewController2实例

之前
vc2.mainVC=self;

您在ViewController2的调用将变为

[self.mainVC callWebService];

冒着让您更加困惑的风险,作为设计说明,在视图控制器中使用callWebService方法可能不是最佳选择。为此目的创建singleton类可能更合适。

答案 1 :(得分:0)

如果您想使用课外的方法,则应在ViewController1.h文件中声明,而不是m,否则它们不可见(您仍然可以使用{{{ 1}}但你应该使用第一个解决方案)

答案 2 :(得分:0)

首先,不要为此目的使用视图控制器,创建一个新类来处理相同类型的方法,然后在视图控制器中使用它。如果您希望在程序中共享SAME类,则创建一个单例。

How to call method from one class in another (iOS)

但是,如果你仍然想让视图控制器来查看控制器的东西,那么它无法工作的原因是因为你正在实例化一个新的视图控制器,而不是你已经使用过的控制器。

您必须将第一个VC的引用传递给第二个VC。这取决于你如何呈现第二个VC。如果您使用的是Interface Builder,则需要使用:

How to pass prepareForSegue: an object

如果您手动创建和展示VC,在呈现之前请告知它哪个是第一个VC。

你可以使用这样的代表:

How do I set up a simple delegate to communicate between two view controllers?

仍然考虑重新设计您对视图控制器的使用。

修改

2个选项,

1)Singleton:

请遵循本指南http://www.galloway.me.uk/tutorials/singleton-classes/

2)AppDelegate:

在app委托的.m中实例化该类的对象,并将其分配给App Delegate的.h中的属性。 然后,检索此对象。

这是使用ios的动画管理器执行此操作的示例

AppDelegate.h:

@property (strong,nonatomic) CMMotionManager *motionManager;

AppDelegate.m

_motionManager = [[CMMotionManager alloc] init];

ViewController1-2-等

CMMotionManager *motionManager;
motionManager = ((AppDelegate*)[UIApplication sharedApplication].delegate).motionManager;