簡體   English   中英

快速處理表格視圖控制器的詳細信息頁面

[英]handle detail page for table view controller in swift

我有一個帶有單元格的表視圖控制器。 單擊單元格時,我加載了另一個視圖控制器,並且我想處理該視圖控制器上的元素。 在詳細信息視圖控制器上,我放置了一個標簽,並且第一步要設置標簽的文本,但出現一個fatal error: unexpectedly found nil while unwrapping an Optional value的異常fatal error: unexpectedly found nil while unwrapping an Optional value ,我不知道為什么。 有什么解決辦法嗎?

這是我的表格視圖控制器中單擊單元格的一部分:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    let vcMissionDetail : ViewControllerMissionDetail = self.storyboard?.instantiateViewControllerWithIdentifier("MissionDetail") as ViewControllerMissionDetail;

    //load detail view controller
    self.presentViewController(vcMissionDetail, animated: true, completion: nil)

    //set label text
    //at this line I get the exception -> label is nil
    vcMissionDetail.label.text = "Test"
}

這是我的詳細信息視圖控制器(非常簡單):

import UIKit

class ViewControllerMissionDetail: UIViewController {

    @IBOutlet var label: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

謝謝!

我認為解決您的問題非常簡單。 如果我理解正確,那么當您使用didSelectRowAtIndexPath從表視圖控制器中選擇時,您想更改詳細視圖控制器上的標簽。 您可能會犯一個錯誤的地方是,您正在嘗試從表視圖控制器更改詳細信息視圖控制器中的標簽。 解決問題的正確方法是在詳細視圖控制器的“ viewDidLoad”或“ viewDidAppear”方法中設置標簽文本。

override func viewDidLoad() {
    super.viewDidLoad()
    //set label text here
}
override func viewDidAppear() {
    super.viewDidLoad()
    //OR set label text here
}

instantiateViewControllerWithIdentifier返回一個可選參數,因為它可能由於多種原因而失敗。 因此,您最好有條件地打開它:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    if let vcMissionDetail : ViewControllerMissionDetail = self.storyboard?.instantiateViewControllerWithIdentifier("MissionDetail") as ViewControllerMissionDetail {

        //set label text before presenting the viewController
        vcMissionDetail.label.text = "Test"

        //load detail view controller
        self.presentViewController(vcMissionDetail, animated: true, completion: nil)
    }
}

要進一步檢查的其他事項:

是否在InterfaceBuilder的身份檢查器中將ViewControllerMissionDetail設置為viewController的自定義類?

如果成功實例化了vcMissionDetail ,但它仍然崩潰,請在InterfaceBuilder中刪除標簽的插座連接並重新創建它。

快速:

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    self.performSegueWithIdentifier("showItemDetail", sender: tableView)
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    if segue.identifier == "showItemDetail" {
        let indexPath:NSIndexPath = self.tableView.indexPathForSelectedRow()!
        let detailVC:ItemDetailViewController = segue.destinationViewController as ItemDetailViewController
        detailVC.item = items[indexPath.row] as Item

    }
}

暫無
暫無

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

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