簡體   English   中英

Swift-在視圖控制器之間傳遞數據

[英]Swift - Passing data between view controllers

我是移動開發的新手,我正在用Swift構建一個iOS應用程序,其中涉及一個過程,在該過程中,用戶以導航控制器堆棧中的多個視圖控制器的形式回答一系列問題。

基本上,我需要捕獲用戶在其從控制器A到控制器D的過程中單擊的所有按鈕中的文本。(單擊一次按鈕會轉到下一個視圖控制器)到用戶到達控制器D時,我要具有代表他從控制器A到C按下的數據的數組。

在控制器D上,我詢問用戶是否要重復該過程。 例如,我會問用戶關於他們擁有的汽車的信息,如果他們擁有另一輛汽車,D會將其帶回控制器A,然后再次重復該過程,將新的響應保存為另一個數組。

在用戶沒有更多的汽車之后,該程序將移至下一部分,在該部分中,我需要從之前加載這些數組,並根據輸入的內容顯示不同的視圖控制器。

處理此問題的最佳方法是什么? 我考慮過使用SQlite臨時保存數據,但是其他人卻告訴我使用NSUserDefaults,因為它花費的時間更少。 我不需要該應用程序的持久性,因為我希望用戶在退出應用程序后從頭開始重新啟動該過程。

將值存儲在其中一個視圖控制器中:

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的路徑可以稱為用戶的會話。 您需要的是一種在任何控制器外部存儲有關此會話的信息的方法,並且可以從任何控制器訪問該會話。

您應該創建一個Session類(抱歉,Objective-C中的示例而不是Swift中的示例):

會話h

@interface Session : NSObject

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

@end

會話

@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]; ),並在所有控制器中使用它。

編輯 :自從我的原始答案中學到了很多。

我要做的(這可能不是唯一的方法,但是對我有用)是在主View Controller以及修改數據的每個View Controller上實例化一個我需要的類型的類。 如果我需要更新引用該類的信息,可以在segue中傳遞對象(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
        } 

    } 

} 

由於它們是通過引用傳遞的,因此更改“ remoteObject”中的數據成員也會更改“ localObject”中的數據成員,因為它們引用的是同一對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM