我创建了一个iPad应用程序,我将用它来对员工进行调查。该应用程序将包含多个UIViewControllers。
到目前为止我做了什么:
我创建了一个"调查"类。此类包含我将在调查过程中填写的字段的属性。基本的东西,如姓名,电子邮件地址,年龄等。
我为UIViewController创建了一个名为SVViewController的子类。在该课程中,我在导入Survey类后创建并初始化了一个名为survey的Survey实例。
我访问了我已经创建并与故事板视图关联的每个UIViewController类,并更改了它们的继承,以便它们从SVViewController继承。
我对这一切仍然很陌生,而且我无法弄清楚我将如何继续前进。我希望Survey的实例(再次称为" survey")包含用户填写的所有数据。当有人在第一个视图中输入他们的名字时,我希望它与该实例进行通信调查更新名称。然后,我想进入下一个视图,并提取" name"从调查的实例。
基本上,我需要调查,这是调查的一个实例,贯穿所有观点。我在网上找到了一个关于单身模式的例子,我从那开始,但我遇到了一些麻烦。在进一步讨论之前,我将粘贴一些代码:
Survey.h
#import <Foundation/Foundation.h>
@interface Survey : NSObject
@property (nonatomic, strong) NSMutableString *name;
@property (nonatomic, strong) NSMutableString *emailAddress;
@end
Survey.m
#import "Survey.h"
@implementation Survey
@end
SVViewController.h
#import <UIKit/UIKit.h>
#import "Survey.h"
@interface SVViewController : UIViewController {
Survey *survey;
}
@property (nonatomic, retain) Survey *survey;
+(id)sharedManager;
@end
SVViewController.m
#import "SVViewController.h"
@interface SVViewController ()
@end
@implementation SVViewController
@synthesize survey;
+(id)sharedManager{
static SVViewController *sharedSVViewController = nil;
@synchronized(self){
if(sharedSVViewController == nil)
sharedSVViewController = [[self alloc]init];
}
return sharedSVViewController;
}
- (id) init{
if(self = [super init]){
survey = [[Survey alloc] init];
}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
我确定这有点乱,我试着玩了很久。我认为正在发生的是调查的单个实例正在创建,但是当我尝试将诸如设置值设置为Survey(name,emailAddress等)的属性然后重写它们以检查以查看如果他们改变了,我只是得到了空的回报。我假设这是因为我没有在任何地方初始化房产,但我在找出去哪里时遇到了很多麻烦。
提前谢谢你。
答案 0 :(得分:2)
您想要创建Survey
的单个实例,但看起来您已编写代码来创建SVViewController
的单个实例。相反,试试这个:
@interface Survey : NSObject
+ (instancetype)sharedInstance;
@property (nonatomic, strong) NSMutableString *name;
@property (nonatomic, strong) NSMutableString *emailAddress;
@end
@implementation Survey
+ (instancetype)sharedInstance {
static Survey *_instance;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [[Survey alloc] init];
});
return _instance;
}
@end
答案 1 :(得分:2)
要在应用内共享数据,您可能需要使用单例。例如,创建名为CommonData的.h和.m,in.h
#import <Foundation/Foundation.h>
@class User; // for your case, you may want to use Survey
@interface CommonData : NSObject
@property (strong) User *currentUser; // this is to store data used across all UIViewController
+ (CommonData *)sharedModel;
@end
in.m
#import "CommonData.h"
#import "User.h"
@implementation CommonData
@synthesize currentUser;
- (id) init
{
self = [super init];
if (self)
{
currentUser = [[User alloc] init];
}
return self;
}
+ (CommonData *)sharedModel
{
static CommonData *_sharedModel = nil;
static dispatch_once_t onceSecurePredicate;
dispatch_once(&onceSecurePredicate,^
{
_sharedModel = [[self alloc] init];
});
return _sharedModel;
}
@end
无论何时想要设置或获取,都可以通过[CommonData sharedModel] .currentUser.xxx访问数据。我曾经使用AppDelegate来存储应用程序内共享的数据。但是,我遇到了一些奇怪的问题(见Change property of AppDelegate from UIViewController is not working)。到目前为止使用Singtelon这么好。希望它有所帮助。
此致 锤