我在ViewController1.m中声明了我的方法'callWEBservice()
',我想在ViewController2.m中调用。我在ViewController2.m中创建了ViewController1.m的对象:
ViewController1* mainVC = [[ViewController1 alloc] init];
现在我试图调用该方法,但我无法做到。请帮忙解决这个问题,因为我是iOS的新手,我搜索了一些人说要使用代表。
答案 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;