如何在许多视图中创建类的单个实例并更新该类的数据?

时间:2014-10-29 14:28:16

标签: ios objective-c iphone uiviewcontroller

我创建了一个iPad应用程序,我将用它来对员工进行调查。该应用程序将包含多个UIViewControllers。

到目前为止我做了什么:

  1. 我创建了一个"调查"类。此类包含我将在调查过程中填写的字段的属性。基本的东西,如姓名,电子邮件地址,年龄等。

  2. 我为UIViewController创建了一个名为SVViewController的子类。在该课程中,我在导入Survey类后创建并初始化了一个名为survey的Survey实例。

  3. 我访问了我已经创建并与故事板视图关联的每个UIViewController类,并更改了它们的继承,以便它们从SVViewController继承。

  4. 我对这一切仍然很陌生,而且我无法弄清楚我将如何继续前进。我希望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等)的属性然后重写它们以检查以查看如果他们改变了,我只是得到了空的回报。我假设这是因为我没有在任何地方初始化房产,但我在找出去哪里时遇到了很多麻烦。

    提前谢谢你。

2 个答案:

答案 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这么好。希望它有所帮助。

此致 锤