想从appdelegate调用ViewController的方法

时间:2014-09-24 07:34:23

标签: ios objective-c methods uiviewcontroller appdelegate

我想在AppDelegate.m中调用ViewController的方法。 我在Viewcontroller中有方法method()。我希望在appdelegate.m中调用didSelectMethod()时调用它。 我已经调用了这样的方法.-

ViewController *vc=[[ViewController alloc]init];
[vc method];
调用

方法,但没有与实际方法相同的实例。 它具有所有nill个值。任何人都可以为我提供正确的代码。

谢谢 Jagveer Rana

5 个答案:

答案 0 :(得分:4)

虽然对于视图控制器为rootViewController的情况已经正确回答了这个问题,但为了完整起见,您可以在这里使用任何视图控制器:

// ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

- (void)myMethod;

@end

// ViewController.m

#import "ViewController.h"
#import "AppDelegate.h"

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    appDelegate.myViewController = self;

}

- (void)myMethod
{
    NSLog(@"Doing something interesting");
}

// AppDelegate.h

#import <UIKit/UIKit.h>
#import "ViewController.h"

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (weak, nonatomic) ViewController *myViewController;

@end

// AppDelegate.m

#import "AppDelegate.h"

@implementation AppDelegate

- (void)applicationDidEnterBackground:(UIApplication *)application {

    [self.myViewController myMethod];

}

答案 1 :(得分:2)

在应用中获取anyViewController相同实例的最简单方法是逐个跟踪它... 喜欢你应用中的任何viewController

[[[UIApplication sharedApplication] keyWindow] rootViewController];

或来自appDelagate

self.window.rootViewController;

它会给你rootViewController然后从这个rootViewController跟踪你想要的viewController。

答案 2 :(得分:1)

在您的问题中,您创建了一个新的视图控制器实例,该实例不属于视图层次结构,因此您不会通过调用该方法(UI-wise)看到任何效果。 (也没有通过xib / storyboard初始化,所以你的UI元素可能是零)

只要它是根视图控制器,您就可以通过窗口访问它(否则您必须在创建时找到它或保留对它的引用):

ViewController *vc = (ViewController *)self.window.rootViewController;
[vc method]; 

答案 3 :(得分:1)

首先,您已在Appdelegate.h中声明了ViewController类,并在AppDelegate.h中创建了UIViewController类的对象,如下所示

@class yourViewControllerClass;
@property (nonatomic,strong) yourViewControllerClass *obj1;

现在在AppDelegate.m中导入ViewController类,就像这样

#import yourViewControllerClass.h;

现在在AppDeledate.m的方法applicationDidFinishLaunchingOption中:创建viewController的新对象并将其分配给obj1,就像这样

yourViewControllerClass *obj2 = [[yourViewControllerClass alloc]init];
obj2 = self.obj1 

借助此代码,您可以在viewcontrollers或objects之间解析数据。现在,在ViewController类的.m文件中,您必须导入Appdelegate.h并将viewController对象中的所有数据解析为obj1,obj1将解析该数据到obj2(使用上面的代码)。[假设你的viewController类的对象为OBJ]。

#import AppDelegate.h
AppDelegate *ad = [[AppDelegate alloc]init];
ad.obj1 = OBJ

注意 - 我还没有测试过这段代码。请先将你的项目保存在其他地方......根据我的知识回答......希望这会对你有所帮助。谢谢你

答案 4 :(得分:0)

在.pch文件中编写此代码

#import "AppDelegate.h"
#define DELEGATE ((AppDelegate*)[[UIApplication sharedApplication]delegate])

在任何想要调用Delegate方法的ViewController中,只需编写此代码即可。

[DELEGATE methodname];