簡體   English   中英

Swift 2-prepareForSegue零值

[英]Swift 2 - prepareForSegue nil Value

我試圖在UITableView選擇一行時通過另一個視圖發送鏈接。 當我選擇該行時,我可以看到鏈接已打印,但是該值不會到達函數prepareForSegue 似乎prepareForSegue函數在UITableView的選擇行之前被調用。

var videouserPath = ""

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

        videouserPath =  self.arrayUserVideo[indexPath.row][4]
        print("tableview: ----\(videouserPath)")
    }


    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        print("segue: ----\(videouserPath)")
        if segue.identifier == "toUserVideo"

        {
            if let destinationVC = segue.destinationViewController as? GetVideo_ViewController{

                destinationVC.videoToDisplay = videouserPath
            }
        }
    }

我進入調試狀態:

segue:----

表格視圖:---- https://example.com/resources/1361929513_02-02-2016_125830.mov

為什么在選擇之前調用segue函數?

從故事板將UIStoryboardSegue鏈接到UITableViewCell ,消息傳遞的順序為prepareForSeguedidSelectRowAtIndexPath

自動方法

完全繞過didSelectRowAtIndexPath

對於通用單元和單選單元格,您無需實現didSelectRowAtIndexPath 讓與UITAbleViewCell關聯的segue進行工作,並按以下方式處理選擇:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "detailSegueIdentifier" {
        if let indexPath = tableView.indexPathForSelectedRow {
            print(indexPath)
        }
    }
}

手動方式

如果你絕對需要SEGUE之前做額外的工作,不要把它關聯到UITableViewCell ,但到UITableViewController 然后,您需要以編程方式觸發它。 靈感在這里
IB中 ,將segue分配給表視圖控制器,為其提供一個標識符(例如detailSegueIdentifier ),然后像這樣調用它。

    override func tableView(tableView: UITableView,
                            didSelectRowAtIndexPath indexPath: NSIndexPath) {
        print("didSelectRowAtIndexPath")
        self.performSegueWithIdentifier("detailSegueIdentifier", sender: nil)
    }

將參數傳遞給segue:

調用performSegueWithIdentifier還將使您有機會顯式傳遞參數,而不是第二個參數indexPathForSelectedRow ,並且不依賴於global(*)。

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

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "detailSegueIdentifier" {
        if let indexPath = sender as? NSIndexPath {
            let name = db[indexPath.row].key
            if let controller = segue.destinationViewController as? DetailViewController {
                controller.name = name
            }
        }
    }
}

(*) 如果可以幫助,永遠不要依賴全局變量

暫無
暫無

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

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