如何从 AppDelegate.m 调用 ViewController.m 方法

Posted

技术标签:

【中文标题】如何从 AppDelegate.m 调用 ViewController.m 方法【英文标题】:How to call a ViewController.m method from the AppDelegate.m 【发布时间】:2014-01-25 17:09:35 【问题描述】:

在我的 ViewController.m 中,我有无效的“保存数据”:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
@synthesize myDatePicker, myTextField;

-(void)saveData

NSArray *value = [[NSArray alloc] initWithObjects:[myTextField text],[myDatePicker date], nil];
[value writeToFile:[self getFilePath] atomically:YES];


我想在我的 AppDelegate.m 中使用我的无效“保存数据”:

- (void)applicationDidEnterBackground:(UIApplication *)application


[self.ViewController saveData];


但 Xcode 无法识别“ViewController”和“saveData”。

我不知道我是否必须在我的 AppDelegate 中#import 一些东西,请帮忙。

【问题讨论】:

当前答案是正确的 - 让您的视图控制器观察您要处理的通知。但是你的电话是非常规的。您是否有一个属性来引用您尝试调用其方法的视图控制器。编译器错误告诉您它们没有正确设置。 【参考方案1】:

您如何从应用程序委托访问您的视图控制器将取决于您拥有多少视图控制器/它在当前导航层次结构中的位置等。您可以为其添加一个属性,或者它可能是您的应用程序委托的@ 987654321@.

但是,当应用进入后台时,您最好在视图控制器中监听通知。这意味着您需要的逻辑可以完全包含在您的视图控制器中,而您的应用程序委托不需要知道任何有关它的信息。

在你的viewcontroller的初始化方法中,你可以注册接收通知:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(applicationDidEnterBackground:)
                                             name:UIApplicationDidEnterBackgroundNotification
                                           object:nil];

然后,实现方法:

- (void)applicationDidEnterBackground:(NSNotification *)notification

    [self saveData];

并确保您在视图控制器的 dealloc 方法中也将自己移除为观察者:

-(void)dealloc 

    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidEnterBackgroundNotification object:nil];

【讨论】:

我按照你说的做了,但是当我关闭应用程序时出现问题,一旦我想再次打开它,它就会崩溃并且无法打开。我不知道那里发生了什么。 ((在 NSNotification 后面应该有一个 * 对吧?)) 是的,应该有一个*,已经更新了我的答案。崩溃时您收到什么错误消息?它在哪一行中断? 没有错误信息。一旦我在运行 ios 7 的 iOS 模拟器中安装了应用程序,关闭 xCode 并重新启动模拟器,它第一次工作,但是当我关闭并再次打开应用程序时,应用程序期望看到我“保存”的内容,应用程序只是没有不开。就这样..【参考方案2】:

在顶部的“appDelegate.m”实现文件中执行此导入 ->

#import "ViewController.h"

这将使自定义类 ViewController 对 appDelegate 可见。

为了能够从另一个类(在我们的例子中另一个类是 AppDelegate 类)调用 -(void)saveData 方法,这个方法需要在公共接口中声明。这意味着 ->

#import "ViewController.h"


@interface ViewController ()

-(void)saveData;

@end

【讨论】:

我按照你说的做了#import,但我仍然无法在我的 AppDelegate.m 中添加[self.viewController saveData],因为 Xcode 无法识别 viewController 也无法再次识别“saveData”。 self.ViewController 暗示您在 appDelegate 上创建了一个名为 ViewController 的属性。第一个问题是,它以大写字母开头。请将其重命名为 viewController。另一件事是,您实际上是否拥有该 viewController 的正确实例?也许这个属性没有初始化。你了解实例的概念吗?即使听起来很傻,我也需要问一下(对不起:)),否则我不确定您的理解有多深。 但是正确的“实例”对我来说听起来很新鲜。你可以帮我解决这个问题。 你贴的是ViewController类接口。我需要查看 AppDelegate.h 界面。

以上是关于如何从 AppDelegate.m 调用 ViewController.m 方法的主要内容,如果未能解决你的问题,请参考以下文章

AppDelegate.m 和 View Controller.m 的区别

从 AppDelegate 重定向到特定屏幕:点击通知

如何从 AppDelegate.m 访问 tabBarController?

如何从 Xcode 中的 AppDelegate.m 文件更新 UILabel 的文本?

Cordova iOS:在 AppDelegate.m 中添加方法调用

来自 appDelegate 的 javascript 调用:phonegap iOS