2016-08-14 124 views
1

我已經開始學習iOS開發(使用Objective-C),並遇到以下問題。在相同視圖控制器類之間傳遞數據

我做了什麼至今:

我要註冊過程分爲若干視圖控制器。例如:

  • 視圖控制器1的字段爲fnamelname
  • 視圖控制器2有一個用於email的字段。
  • 視圖控制器3有一個字段password和一個「保存」按鈕。現在

,創建了一個新UIViewController類文件名爲RegistrationViewController和分配該類上述所有視圖控制器,這樣我可以在一個文件中寫入所有登記相關的代碼。

我已經使用push segue從當前視圖控制器到下一個視圖控制器。

發行

當我點擊最後一個視圖控制器上的「保存」按鈕,我沒能得到的值fnamelnameemail

這是爲什麼?我的意思是,我在同一個文件中。不應該爲這些屬性存儲價值嗎?

回答

1

我用push segue來到viewcontoller的下一個viewcontroller。

推賽格瑞推視圖控制器的一個全新的實例,這意味着在頂部當前視圖控制器將只有在自身設定的值,而值在其所有前任的設置將nil

你不應該依賴於在視圖控制器的字段中存儲值。相反,你應該把它們放在你的模型類的共享實例,通過模型 - 視圖 - 控制器設計模式的建議:

class Model { 
    static let sharedInstance = Model() 
    var fName : String 
    var lName : String 
    ... 
} 

當檢測到下一個視圖控制器即將開啓,存儲狀態

Model.sharedInstance.fName = self.fName 
Model.sharedInstance.fName = self.lName 
... 
+0

感謝您的建議。您正確使用共享實例是一個正確的選擇。你能給我一個簡單的想法,告訴我如何創建一個共享實例,以便它可以適用於所有這三個viewcontollers。我創建了一個新的「AllUsers.h」(NSObject)類文件。 – Jimmy

+0

我使用的是Objective-C語言。 – Jimmy

+0

@Jimmy對不起,我錯過了Objective-C部分。 [這是一個在Objective-C中使用單例模型的例子Q&A](http://stackoverflow.com/a/11945106/335858)。這是相當複雜的,但它本質上是一個複製粘貼練習。 – dasblinkenlight

1

僅僅因爲數據是在「同一個文件」並不意味着任何東西在運行時應用:當前一個共享模型對象積累。您仍然在創建RegistrationViewController類的多個單獨實例。因此,您需要在這些單獨的實例之間傳遞數據,就像完全不同的類一樣。

由於您使用的是故事板和segues,因此方法-prepareForSegue:sender:是一個很好的考慮這樣做的地方。


爲了記錄在案,我同意@ dasblinkenlight的建議,存儲在模型對象,而不是單個字段這個數據,但使用「共享實例」如果你沒有不同意。通過模型對象的一個​​例子是這樣的:

User.h

@property (nonatomic, strong) NSString *fname; 
@property (nonatomic, strong) NSString *lname; 
@property (nonatomic, strong) NSString *email; 

RegistrationViewController.h

@property (nonatomic, strong) User *user; 

RegistrationViewController.m

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    RegistrationViewController *nextViewController = (RegistrationViewController *)segue.destinationViewController; 
    nextViewController.user = self.user; 
} 

- (IBAction)doSaveAction:(id)sender { 
    NSLog("email: %@", self.user.email; 
} 
+0

感謝您的建議。我已經使用shouldPerformSegueWithIdentifier,因爲我想在繼續下一個視圖控制器之前執行驗證。 – Jimmy

+0

理想情況下,您應該使用_both_。 ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''*'''' – Arclite

+0

是否應該在-prepareForSegue方法之前調用SegmentWithIdentifier? – Jimmy

相關問題