2016-02-02 79 views
0

我試圖在UITableView中選擇一行時通過另一個視圖發送鏈接。 當我選擇行時,我可以看到鏈接被打印,但是,該值不會到達功能prepareForSegue。 看起來好像在UITableView的選擇行之前調用了prepareForSegue函數。Swift 2 - prepareForSegue零值

賽格瑞:

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 
      } 
     } 
    } 

我在調試了----

實現代碼如下:---- https://example.com/resources/1361929513_02-02-2016_125830.mov

爲什麼選擇之前稱爲SEGUE功能?

+0

也許可以通過在你的'UIViewController'而不是從'UITableViewCell'設置Storyboard中的segue爲'GetVideo_ViewController'? – Larme

回答

1

當從故事板鏈接UIStoryboardSegueUITableViewCell時,消息傳遞的順序是prepareForSegue,didSelectRowAtIndexPath

自動方法

繞道didSelectRowAtIndexPath完全

對於通用和單選單元,您無需實施didSelectRowAtIndexPath。讓我們與UITAbleViewCell相關的SEGUE做的工作,並處理選擇,像這樣:

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

手動方法

如果你絕對需要SEGUE之前做額外的工作,不要把它關聯到UITableViewCellUITableViewController。然後您需要以編程方式觸發它。靈感here
IB,將segue分配給表視圖控制器,給它一個標識符(說detailSegueIdentifier),並像這樣調用它。

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

傳遞參數給SEGUE:

調用performSegueWithIdentifier也會給你一個機會,明確地傳遞參數,而不是在事後indexPathForSelectedRow,而不是依賴於全局(*) 。

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 
      } 
     } 
    } 
} 

(*)永遠不要依賴於全局,如果你能幫助它