Ios 如何跨多个视图控制器更新类的单个实例?

Ios 如何跨多个视图控制器更新类的单个实例?,ios,objective-c,xcode,oop,Ios,Objective C,Xcode,Oop,早上好 我正在设计一个用于进行调查的应用程序。用户将打开应用程序,创建“新”调查,回答相关问题,然后接收一些输出 这项调查相当复杂。基本上,这个人将回答关于他们每个家庭成员的相同系列问题。问题完成后,用户将允许应用程序获取所有信息并执行一定数量的计算并返回结果 我有一个名为“Survey”的类,它包含用户基本信息(姓名、电子邮件地址等)的属性。我还有一个名为“indQuestions”的类,其中包含需要为每个家庭成员设置值的属性(每个家庭成员都有身高、体重、出生日期、收入等)。根据族的大小,调查

早上好

我正在设计一个用于进行调查的应用程序。用户将打开应用程序,创建“新”调查,回答相关问题,然后接收一些输出

这项调查相当复杂。基本上,这个人将回答关于他们每个家庭成员的相同系列问题。问题完成后,用户将允许应用程序获取所有信息并执行一定数量的计算并返回结果

我有一个名为“Survey”的类,它包含用户基本信息(姓名、电子邮件地址等)的属性。我还有一个名为“indQuestions”的类,其中包含需要为每个家庭成员设置值的属性(每个家庭成员都有身高、体重、出生日期、收入等)。根据族的大小,调查实例将具有任意数量的“indQuestions”实例

现在,我必须在创建新调查时创建一个调查实例,但该调查实例必须包含X个indQuestions实例,并且需要根据用户是否希望进行第二次调查、更改答案以比较返回值等原因创建多个调查

我的应用程序包含许多UIViewController,因为调查很长,并且不是所有内容都可以放在一个页面上,但调查是累积的,它要求我能够访问在以前的UIViewController中输入的每个UIViewController的信息

我考虑过为我的调查类创建一个单一实例,但最终必须有多个调查实例,因为客户可能会选择多次进行调查。此外,客户必须能够添加未知数量的“indQuestions”实例,以适应家庭规模。我一直在绞尽脑汁,试图找出一种方法,既能在多个视图中提供单个调查实例(及其相关值),又能动态创建多个家庭成员

如果您能提供任何指导,我将不胜感激。我不知道如何在这方面取得进展

后续行动: 好的,我假设我会使用下面的实例来创建一个新的调查

+ (instancetype)startNewSurvey {
  static Survey *_instance;
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    _instance = [[Survey alloc] init];
  });
  return _instance;
}
@end

然后我会使用activateSurvey方法将startNewSurvey实例传递到activeSurvey中吗?我试着遵循逻辑

听起来,在
调查中使用sqlite数据库确实可以让您受益匪浅,但如果工作量太大或超出应用程序的设计范围,您可以使用以下策略:

@interface Survey : NSObject
+ (instancetype)startNewSurvey;
+ (instancetype)activeSurvey;
+ (NSArray *)allSurveys;
+ (void)removeSurvey:(Survey *)survey;
+ (void)activateSurvey:(Survey *)survey;

@property (strong) NSMutableArray *indQuestionsObjects;
@end
它允许您有效地拥有一个单一实例,但同时跟踪多个实例。大致实施如下:

@implementation Survey
static Survey *__activeSurvey = nil;
static NSMutableArray *__allSurveys = nil;
+ (instancetype)startNewSurvey {
  if (!__allSurveys) {
    __allSurveys = [[NSMutableArray alloc] init];
  }
  Survey *survey = [[Survey alloc] init];
  [__allSurveys addObject:survey];
  return survey;
}
+ (instancetype)activeSurvey {
  if (!__activeSurvey) {
    __activeSurvey = [self startNewSurvey];
  }
  return __activeSurvey;
}
+ (NSArray *)allSurveys {
  return __allSurveys;
}
+ (void)removeSurvey:(Survey *)survey {
  if (survey) {
    [__allSurveys removeObject:survey];
  }
}
+ (void)activateSurvey:(Survey *)survey {
  __activeSurvey = survey;
}

- (instancetype)init {
  if (self = [super init]) {
    _indQuestionsObjects = [[NSMutableArray alloc] init];
  }
  return self;
}
@end

此方法是否允许我在该单例中创建多个indQuestions实例?我误解了您的
indQuestions
。约定表示以小写字母开头的名称是变量名,而不是类名。我以为你已经有了这些东西的财产。我将根据您的使用情况更新答案。我已使用问题/代码块更新了源站帖子。不,您将无法使用
dispatch\u一次。它不是真正的单例,但它的行为类似于单例,允许您在整个应用程序中访问单个活动实例。非常感谢你的帮助。我对这一切都很陌生,我被要求做一个有点不适合我的申请,所以非常感谢你的帮助。