Swift - 在视图控制器之间传递数据

时间:2015-05-05 05:48:15

标签: ios database sqlite swift core-data

我是移动开发的新手,我正在使用Swift构建一个iOS应用程序,该应用程序涉及一个用户以导航控制器堆栈中的多个视图控制器的形式回答一系列问题的过程。

基本上,我需要捕获用户在从控制器A到控制器D的过程中点击的所有按钮中的文本。(一键点击导致下一个视图控制器)到时,用户到达控制器D ,我希望有一组数据代表他从控制器A到C的压力。

在控制器D上,我询问用户是否要重复此过程。例如,我会询问用户他们拥有的汽车,如果他们拥有另一辆汽车,D会将他们带回控制器A并再次重复该过程,新的响应将保存为另一个阵列。

在用户没有汽车之后,程序将转到下一部分,我需要从之前加载这些数组,并根据输入的内容显示不同的视图控制器。

处理此问题的最佳方法是什么?我曾考虑使用SQlite暂时保存数据,但其他人告诉我使用NSUserDefaults,因为它花费的时间更少。我不需要为此应用程序提供持久性,因为我希望用户在退出应用程序后从头开始重新启动该进程。

3 个答案:

答案 0 :(得分:0)

将值存储在其中一个viewcontrollers中:

let userDefaults = NSUserDefaults.standardUserDefaults()
// user tapped on button 3 (value 2, because 4 buttons => indices 0-3)
userDefaults.setInteger(2, forKey: "Answer1")
userDefaults.synchronize()

在回答完所有问题后加载值:

let userDefaults = NSUserDefaults.standardUserDefaults()
let answer1 = userDefaults.integerForKey("Answer1")
let answer2 = userDefaults.integerForKey("Answer2")
...
userDefaults.synchronize()

删除应用程序启动时保存的内容(在applicationdidfinishlaunching中):

let userDefaults = NSUserDefaults.standardUserDefaults()
userDefaults.removeObjectForKey("Answer1")
userDefaults.removeObjectForKey("Answer2")
...
userDefaults.synchronize()
祝你好运! :)

答案 1 :(得分:0)

我认为从控制器A到控制器D的路径可以称为用户的会话。 您需要的是一种在任何控制器外部存储有关此会话的信息的方法,并且可以从任何控制器访问此会话。

你应该创建一个类Session(抱歉,在Objective-C中的例子不在Swift中):

Session.h

@interface Session : NSObject

- (void)addValue:(id)value;
- (NSArray *)allValues;
- (NSUInteger)valueCount;
- (void)reset;

@end

Session.m

@interface Session () 
{
    NSMutableArray *_values; 
} 
@end

@implementation Session

- (instancetype)init 
{
    self = [super init];

    if( !self ) return nil;

    _values = [[NSMutableArray alloc] init];

    return self; 
}

- (void)addValue:(id)value 
{
    [_values addObject:value]; 
}

- (NSUInteger)valueCount 
{
    return _values.count; 
}

- (NSArray *)allValues 
{
    // NSArray to have a immutable array of values
    return [NSArray arrayWithArray:_values]; 
}

- (void)reset 
{
    [_values removeAllObjects]; 
}

@end

这样,您可以创建一个全局可访问的Session对象(Session *s = [[Session alloc] init];),并在所有控制器中使用它。

答案 2 :(得分:0)

编辑:自我原来的答案以来,我学到了很多东西。

我所做的(这可能不是唯一的方法,但对我有用),是在主视图控制器上以及修改数据的每个视图控制器上实例化我需要的类。如果我需要更新引用该类的信息,我将传递segue中的对象(Swift 3):

$Logg->WriteLog('inside try'); 

由于它们是通过引用传递的,因此更改'remoteObject'中的数据成员也会更改'localObject'中的数据成员,因为它们引用同一个对象。