我有一个简单的测试应用程序来帮助我学习如何将数据从NSMutableArray持久化到plist。在我尝试通过在AppDelegate.m文件中调用名为"saveData“的ViewController方法来保存数据之前,一切似乎都运行得很好:
- (void)applicationDidEnterBackground:(UIApplication *)application
{
[ViewController saveData];
}
我得到了一个“选择器'saveData‘的未知类方法,尽管该方法在ViewController.h中已明确声明,如下所示:
//
// ViewController.h
// PlistTest
//
// Created by Tim Jones on 10/30/13.
// Copyright (c) 2013 TDJ. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *nameLabel;
@property (weak, nonatomic) IBOutlet UILabel *timeLabel;
@property NSMutableArray *mainActivityArray;
- (IBAction)buttonHit:(id)sender;
-(NSString *) getFilePath;
-(void) saveData;
-(void) loadData;
@end
并在ViewController.m中实现,因此:
//
// ViewController.m
// PlistTest
//
// Created by Tim Jones on 10/30/13.
// Copyright (c) 2013 TDJ. All rights reserved.
//
#import "ViewController.h"
#import "DataClass.h"
@interface ViewController ()
@end
@implementation ViewController
-(NSString *) getFilePath
{
NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
return [[pathArray objectAtIndex:0] stringByAppendingPathComponent:@"PlistTestData"];
}
-(void) saveData
{
[self.mainActivityArray writeToFile: self.getFilePath atomically:YES];
}
我将ViewController.h导入到AppDelegate.h。
我是个新手,所以我希望这个问题对这里的许多人来说是显而易见的。一定会很感谢你的帮助的。
发布于 2013-11-01 19:14:08
问题:
[ViewController saveData];
您正在使用类名ViewController
调用saveData
方法。
但是saveData
是一个实例方法,而不是类方法。
-(void) saveData;
修复:
1)将saveData
声明为类方法
+(void) saveData;
2)使用ViewController
的对象调用saveData
。
ViewController *vControl = [[ViewController alloc] init];
[vControl saveData];
发布于 2013-11-01 20:55:53
之前的答案(Midhun #2)可以工作,但我认为使用应用程序进入后台通知并跳过委托会更好。
只需将此代码添加到"view did load“中:每当应用程序转到后台时,它都会调用saveData。
[选择器添加name:UIApplicationDidEnterBackgroundNotification :自身选择器:@NSNotificationCenter(SaveData)选择器对象:nil];
希望这能有所帮助。
发布于 2013-11-02 06:51:07
正如其他人所指出的,您的问题在于,您的[ViewController saveData]
方法调用清楚地表明您正在尝试调用"class method",并且您无疑希望调用您的“实例方法”(因为拥有您要保存的数据的是视图控制器的实例)。要实现这一点,您有两个基本选择:
saveData
方法。在不同的评论中,你提到你已经“尝试了我能想象到的每一种方式和每一个地方的VC”。不要。Midhun的例子是一个概念性的例子,说明了类和实例方法之间的区别。但是,虽然您希望调用instance方法,但您希望为视图控制器的现有实例调用该方法,而不是实例化新的视图控制器。
因此,您可能会问,如何获得对视图控制器现有实例的引用?您要做的是(a)在您的应用程序委托中创建一个属性,以使用saveData
方法保存对视图控制器的引用;(b)让该视图控制器设置应用程序委托的该属性。因此,首先,在应用程序委托的.h文件中创建一个属性来引用视图控制器:
@property (弱,非原子) ViewController *视图控制器;
显然,不要忘记.h文件前面的#import "ViewController.h"
行。
其次,让视图控制器的viewDidLoad
方法更新应用程序委托的委托{ viewController
viewDidLoad;AppDelegate *viewController
= [UIApplication sharedApplication delegate];delegate.viewController = self;}
同样,不要忘记在ViewController.m
文件的顶部使用#import "AppDelegate.h"
。
完成此操作后,应用程序代理的applicationDidEnterBackground
现在可以引用您在viewDidLoad
坦率地说,如果你使用了这种技术,我可能会建议进一步的改进,特别是采用委托协议模式,但我会推迟到你掌握了上面的technique.
applicationDidEnterBackground
代码,让你的视图控制器本身响应与应用进入后台相关的系统通知。而且,不用说,您可以将此代码正确地放入视图控制器itself.如您所见,我在viewDidLoad
中注册观察UIApplicationDidEnterBackgroundNotification
,但也要确保在dealloc
中删除我的观察者。我还确保我的@selector
方法名与我的方法名完全匹配(例如,在我的示例中,没有参数,因此没有冒号)。
https://stackoverflow.com/questions/19733742
复制相似问题