2016-04-08 15 views
0

我想創建一個簡單的聯繫人列表應用程序作爲學習Swift的途徑。不幸的是,無論我嘗試什麼,我都無法將我的聯繫人的詳細信息顯示到不同視圖控制器上的可編輯文本字段中(包含主要聯繫人)。Swift不允許我設置變量數據

這裏是一個要實現的文本字段代碼塊(我不確定什麼其他的代碼提供)

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "showDetail" { 
     if let indexPath = self.tableView.indexPathForSelectedRow { 
      let object = objects[indexPath.row] 
      let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailViewController 
      print(object.firstName) 
      controller.fiName?.text = object.firstName 
      controller.laName?.text = object.lastName 
      controller.miName?.text = object.middleName 
      controller.aess?.text = object.address 
      controller.phoNumber?.text = object.phoneNumber 
      controller.yearBirth?.text = String(object.age) 
      print(controller.fiName) 
      controller.detailItem = object 
      controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem() 
      controller.navigationItem.leftItemsSupplementBackButton = true 
     } 
    } 

打印的第一行的結果是,我希望它是,這是聯繫人的名稱,但該程序在第二次打印時崩潰,並顯示'EXC_BAD_INSTRUCTION'/致命錯誤:意外地發現零,而解包和可選值。

爲什麼我不能設置controller.fiName?.text?預先感謝您的任何幫助。

+0

你讀過我的回答了嗎? –

回答

2

我猜你的filNameUILabelUITextField吧?

如果您在DetailViewController檢查你的代碼,你會發現這條線:

@IBOutlet weak var filName: UITextField! 

你看!在該行的結束?

這意味着變量(aka outlet)filName不能在初始化時設置,但會在稍後的某個點設置。

現在,你要做的就是初始化你的類,並嘗試訪問尚未在初始化時設置的屬性。

要解決此問題,請在DetailViewController中創建一個對象實例,並將該實例設置爲所選對象,然後在viewDidLoad函數中設置標籤屬性。

事情是這樣的:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "showDetail" { 
     if let indexPath = self.tableView.indexPathForSelectedRow { 
      let object = objects[indexPath.row] 
      let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailViewController 
      controller.object = object 
     } 
} 

然後在viewDidLoadDetailViewController的:

override viewDidLoad() { 
     fiName?.text = object.firstName 
     laName?.text = object.lastName 
     miName?.text = object.middleName 
     aess?.text = object.address 
     phoNumber?.text = object.phoneNumber 
     yearBirth?.text = String(object.age) 
     navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem() 
     navigationItem.leftItemsSupplementBackButton = true 
} 
+0

哇!非常感謝您的回覆。當我執行代碼時,如果你已經佈局,我仍然意外地發現零,同時解開可選值。另外,由於沒有'object.firstName'(但由於某種原因有一個object.middleName ??),所以它看起來好像沒有被正確傳遞。 –

+0

我弄明白了,一個簡單的小錯誤,我我永遠感謝您的幫助先生! –

2

您正在設置fiName標籤文本爲時尚早,尚未分配標籤。而是通過對象,然後在下一個控制器的viewDidLoad中設置文本。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "showDetail" { 
     if let indexPath = self.tableView.indexPathForSelectedRow { 
     let object = objects[indexPath.row] 
     let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailViewController 

     //pass through object: 
     controller.object = object 

     print(object) 
    } 
} 

然後在接下來的viewController viewDidLoad中設置文本:

override viewDidLoad() { 
    //Now set the text value here: 
    fiName?.text = object.firstName 
} 
+0

嗨,喬!非常感謝您的回覆。所有的答案都讓我更好地理解我正在嘗試做什麼。對不起,我沒有更早回覆你的答案,我寫了一半的回覆,並忘記了它:-)一切順利 –

+0

沒問題@LiamS,如果你可以投票/將它標記爲接受我的會很好。希望我能幫上忙。 –

1

只是對象應在prepareForSegue

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     if segue.identifier == "showDetail" { 
      if let indexPath = self.tableView.indexPathForSelectedRow { 
       let object = objects[indexPath.row] 
       let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailViewController 
       controller.detailItem = object 
       controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem() 
       controller.navigationItem.leftItemsSupplementBackButton = true 
      } 
     } 
    } 

獲得通過,那麼網點應建立在viewDidLoad

class DetailViewController: UIViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     fiName?.text = detailItem.firstName 
     laName?.text = detailItem.lastName 
     miName?.text = detailItem.middleName 
     aess?.text = detailItem.address 
     phoNumber?.text = detailItem.phoneNumber 
     yearBirth?.text = String(detailItem.age) 
    } 
}