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



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

基本上,我需要从用户从控制器A到控制器的过程中单击的所有按钮中捕获文本。,我想拥有一系列代表他从控制器A到C的数据。

在控制器D上,我问用户是否想重复该过程。例如,我会向用户询问他们拥有的汽车,如果他们拥有另一辆汽车,D会将它们带回控制器A,然后再次重复该过程,将新响应保存为另一个数组。

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

处理此问题的最佳方法是什么?我已经考虑使用SQLite暂时保存数据,但是其他人告诉我使用NsuserDefaults,因为这需要较少的时间。我不需要此应用程序的持久性,因为我希望用户退出应用程序后从一开始重新启动该过程。

将一个值存储在一个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()

祝你好运!:)

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

您应该创建一个课程会话(对不起,在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 *s = [[Session alloc] init];),并在所有控制器中使用它。

edit :从我的原始答案开始学习很多。

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

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let identifier = segue.identifier {
        switch identifier {
            case constants.aSegue: // not the real name of my segue :-P
                // grab inside the navcon
                if let navCon = segue.destination as? UINavigationController {
                    if let destinationVC = navCon.viewControllers.first as? CGSettingsPopupViewController {
                        destinationVC.remoteObject = localObject 
                        // localObject is a kind of the class I need, as is remoteObject 
                        // now, changes to destinationVC.remoteObject will be accessible locally, when the destinationVC returns control

                }
            }
            default:
                break
        } 
    } 
} 

由于它们是通过参考传递的,因此在"远程对象"中更改数据成员也更改了" localobject"中的数据成员,因为它们是指同一对象。

最新更新