0

这是一个老生常谈的问题,我有一些编程经验,但是 Objective-c 对我来说是全新的,我找不到关于整个 Objective-c 概念的任何明确定义。这里有一些我已经知道的理论:我不能直接访问类的实例变量,因此我必须使用属性或“访问器方法”来访问它。好的。我尝试了一些我的意思是访问器方法,但是嗯,这都是错误的。我想你可以帮我解决这个问题。

这是我的示例:我有 Cat 类,以及一个包含有关猫的信息的 plist。Plist 存储宠物的姓名和年龄。我想做这个:具有文本字段、标签和按钮的简单视图。Label - 是当前宠物名称,textField 用于更改在 textfield now 方法中的猫名称(更改猫名听起来令人毛骨悚然,但这只是一个示例),以及一个用于向更改名称功能发送消息的按钮。在我按下主页按钮后,我想通过 AppDelegate.m 文件将名称保存到文件中,这是一个问题,我将在下面描述。

我不知道如何将代码包装到一个隐藏的块中,直到你打开它,所以我不想在这里用大量的代码行打扰你的眼睛。我添加了一个代码链接和一些带有日志输出的屏幕。(如果有人会说我该怎么做,我会在这里添加代码),但现在这里是链接: http ://shlonger.com/680dc6cf21aa426c4bed107213ab4467

我无法从 AppDelegate 访问应用程序运行时实现的对象。我为类变量创建了一些属性和一些 getter/setter 方法,但是当我在 AppDelegate 中初始化 Cat 类时,它再次创建了另一个具有默认设置的对象(如在 plist 文件中)。如何以正确的方式通过 AppDelegate 保存当前设置?

抱歉,问题描述很长。

4

1 回答 1

3

您不一定需要与 通信AppDelegate,但您可以通过[[UIApplication sharedApplication] delegate]. 然后,您可以访问所需的任何属性,但您可能需要强制转换它:

// assuming your application delegate is of type 'AppDelegate' - usually the default provided by Xcode
AppDelegate *delegate = (AppDelegate*)[[UIApplication shared application] delegate];
// you can now all you application delegat's properties.

在您的课程中,另一种方法Cat是注册应用程序委托发布的通知。例如:

@implementation Cat

-(id)init {
    if ( (self = [super init]) ) {
        // you can also attempt to read stored values form disk here
        // perform all your other initialization that you already have

        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(handleNotification:)
                                                     name:UIApplicationDidEnterBackgroundNotification
                                                    obect:[UIApplication sharedApplication];
    }
}

在您的Cat类中,定义一个方法handleNotification:,因为它是提供给通知中心的选择器。这是发布时通知中心将在您的Cat班级上调用的方法UIApplicationDidEnterBackgroundNotification

-(void)handleNotification:(NSNotification*)notification {
   NSString *name = notification.name;
   id sender = notification.object;

   if ( [name isEqual:UIApplicationDidEnterBackgroundNotification] && [sender isEqual:[UIApplication sharedApplication] ) {
       // save `Cat` class to disk as plist or however you want 
   }
}

你也可以UIApplicationDidEnterBackgroundNotificationUIApplicationWillResignActiveNotification. 我将由您决定哪个最适合您的需求。

更多关于使用NSNotificationCenter.

更新

Cat第二种方法的优点是你的类和应用程序委托之间不需要任何特定的知识或依赖关系。两个对象可以彼此独立运行。这[UIApplication sharedApplication]是一个可用于 iOS 应用程序中运行的任何对象的单例,但同样,您不需要知道确切的类型。唯一需要的特定知识是通知名称,但即使是这些名称也是全局可访问的。

于 2013-03-03T22:12:16.033 回答