2016-09-26 56 views
1

您好我正在開發一個應用程序與自定義操作在tableview單元格。IOS目前ViewController並傳遞裏面的數據editActionsForRowAt

當用戶滑過單元格時。將會有2個動作:刪除和更多。我想要更多的動作來呈現一個新的viewController並將對象數據傳遞給新的viewController。我們如何實現這一目標?

我一直在使用這viewDidLoad

if let split = self.splitViewController { 
      let controllers = split.viewControllers 
      self.detailViewController = (controllers[controllers.count-1] as! UINavigationController).topViewController as? DetailViewController 
     } 

editActionsForRowAt方法

override func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? { 

     let moreRowAction = UITableViewRowAction(style: .normal, title: "More", handler:{action, indexpath in 

      if let indexPath = self.tableView.indexPathForSelectedRow { 
       let object = self.fetchedResultsController.object(at: indexPath) 
       let controller = self.detailViewController! 
       controller.detailItem = object 
       controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem 
       controller.navigationItem.leftItemsSupplementBackButton = true 
       self.present(controller, animated: true, completion: nil) 
      } 
//    self.performSegue(withIdentifier: "showDetail", sender: self) 
     }); 
     moreRowAction.backgroundColor = UIColor(red: 0.298, green: 0.851, blue: 0.3922, alpha: 1.0); 

     let deleteRowAction = UITableViewRowAction(style: .destructive, title: "Delete", handler:{action, indexpath in 
      self.deleteTapped(indexPath: indexPath as NSIndexPath) 
     }); 

     return [deleteRowAction, moreRowAction]; 
    } 

刪除功能工作

,但更多的行動不起作用嘗試。幫助是非常感謝!由於

enter image description here

prepareforseuge

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     if segue.identifier == "showDetail" { 
      if let indexPath = self.tableView.indexPathForSelectedRow { 
      let object = self.fetchedResultsController.object(at: indexPath) 
       let controller = (segue.destination as! UINavigationController).topViewController as! DetailViewController 
       controller.detailItem = object 
       controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem 
       controller.navigationItem.leftItemsSupplementBackButton = true 
      } 
     } 
    } 
+0

人有一個理想是什麼? –

+0

你在使用故事板嗎?即。你想繼續到新的視圖控制器?或者你是否在使用NIB或編程視圖控制器創建?我看到你有一個評論segue,所以我猜測前者? – Paulw11

+0

嗨,是的。我有一個tableviewCell標籤的segue。試圖使用執行segue但信息不傳遞給新的Viewcontroller。信息只有通過正常點擊(不在刷卡編輯) –

回答

2

您可以通過sender參數,以此來傳遞賽格瑞你的對象:

let moreRowAction = UITableViewRowAction(style: .normal, title: "More", handler:{action, indexpath in 
     let object = self.fetchedResultsController.object(at: indexPath) 
     self.performSegue(withIdentifier: "showDetail", sender: object) 
    }); 

然後在prepare(for segue: sender:) -

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "showDetail" { 
     guard let navVC = segue.destination as? UINavigationController, 
      let destVC = navVC.viewControllers.first as? DetailViewController else { 
       return 
     } 

     var object = sender as? Event 
     if object == nil { 
      if let indexPath = self.tableView.indexPathForSelectedRow { 
       object = self.fetchedResultsController.object(at: indexPath) 
      } 
     } 
     destVC.detailItem = object 
    } 
} 

Master-Detail模板項目使用導航控制器作爲詳細目標,因此prepare(for segue)函數需要訪問導航控制器的第一個視圖控制器。

此外,由於您使用的排水龍頭和「多」的行動,我的代碼檢查相同SEGUE的兩種可能性 - 詳細的項目可能是發送者或選擇行

+0

嗨,感謝您的幫助。我在這個問題中加入了我的準備。如果讓let ...的代碼不是調用(可能是它無法獲得tableview.indexPathForselectedRow。如果我移動let obje ...和self.perfomSegue .. outside。它可以導航到新的viewcontroller,但信息不通過(得到nil的新viewController的變量) –

+0

@LêKhánhVinh'moreRowAction'塊已經有索引路徑,爲什麼你仍然'如果讓'它,只是檢查數據源是否有該數據在該indexPath和'performSegue',它doesn因爲你沒有選擇它而不打電話 – Tj3n

+0

信息沒有傳遞給新的ViewController,因爲segue是從tableview單元格標籤(從storyboard設置的)。 –

相關問題