2014-11-03 58 views
-1

我正在學習爲iOS開發,同時構建一個簡單的應用程序,該應用程序從數據庫加載數據並將其顯示爲tableview,但我有一些我迄今爲止無法理解的問題。 主 - 細節控制器的類是由我創建的,而不是由XCode模板創建的,如果這很重要的話。將主數據傳遞給詳細視圖控制器的正確方法是什麼?

  1. 我嘗試從主控制器的tableview數據傳遞給細節 控制器。數據就像一對字符串一樣簡單。我爲此使用了 segue。在prepareForSegue方法我做 如下:

    if ([segue.identifier isEqualToString: @"DetailsSegue"]) { 
        DetailsViewController* dvc = (DetailsViewController*)segue.destinationViewController; 
        NSInteger selectedRow =[self.tableView indexPathForSelectedRow].row; 
        dvc.nameLabel.text = [NSString stringWithFormat:@"%@", 
            [[self.entitiesArray objectAtIndex:selectedRow name]]; 
        ... 
    } 
    

    的這裏的問題是,dvc.nameLabelnil。我想, 可能是因爲控制器尚未完全創建。 那麼,dvc指針不是nil,但我沒有看到我的 init方法中的日誌,所以我的想法,它沒有被初始化。

    我決定創建DetailsViewController 的實例變量和prepareForSegue設置:

    dvc->name = [NSString stringWithFormat:@"%@", 
          [[self.entitiesArray objectAtIndex: selectedRow] name]]; 
    

    ,然後我在viewDidLoad方法

    設置nameLabel屬性,並將其實際工作!所以我想我將無法設置單個實例的實例變量。但我做到了。那有什麼不對?我覺得這不是人們這樣做的方式, 至於有一個多變量持有同樣的事情似乎是多餘的。

那麼,什麼是使用SEGUE到另一個控制器傳遞變量(在我的情況的NSString)的正確方法?

謝謝你們的幫助

+0

可能重複[在視圖控制器之間傳遞數據](http://stackoverflow.com/questions/5210535/passing-data-between-view-controllers) – 2014-11-03 16:49:22

回答

0

如果你想數據,你有理由這樣做。不保證UI元素在視圖控制器的主視圖完成加載之前被初始化,因此非UI變量相當常見。

對於更復雜的應用程序或您期望增長和維護的應用程序,更好的方法是創建組成應用程序數據模型的類(或類)。任何修改共享數據的內容都會向模型發送更新,並且需要使用共享數據的任何內容從模型中讀取。該策略的許多積極結果中,視圖控制器之間的串擾較少。

+0

這種方法中的模型類應該是單身? – rightaway717 2014-11-03 14:29:22

+0

它可以是一個單,也可以是一個對象,你可以從應用程序的委託獲得,有點像應用程序窗口和根視圖控制器的視圖和控制器的層次結構。 – 2014-11-03 14:54:56

1

你的代碼中的問題是你試圖操縱其他VC視圖。不要這樣做。相反,您應該在目標視圖控制器中創建屬性以保存要顯示的數據。

正如另一位海報所說,創建一個包含記錄數據的類並通過該類是有意義的。你可能讓你的主視圖控制器的模型是這些對象的數組。主人將使用數據對象來填充表格視圖。當用戶點擊某一行打開一個詳細視圖時,您需要將該數據對象的副本傳遞給prepareForSegue中的詳細視圖控制器。然後

詳細視圖控制器可如果需要的話對其進行編輯,並通過編輯的對象回到主視圖控制器,如果用戶已保存的更改,或者如果用戶取消簡單地丟棄被編輯的對象。

是的,你可以使用一個單獨保存您的數據模型。

+0

+1指出如何正確地做到這一點,所以我在做了錯誤的方式。 – rightaway717 2014-11-03 16:52:16

相關問題