[英]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.