如何从Swift中的UITableViewRowAction传递数据到UIViewController?

我是iOS编程新手,我一直在寻找如何做到这一点,但似乎无法find我在找什么。 我认为这将是一件相当简单的事情,我相信是有人能够启发我的。

在表格视图上向左滑动时,我有一些可以执行的自定义操作。 其中一个操作是对所选项目的简单“编辑”。 我想要做的就是显示另一个视图控制器,但传递一些数据到视图控制器,比如prepareForSegue(…)中的正常情况。

这是我的。 请参阅标记为“//选项2”的部分…

// Override to provide additional edit actions when the users swipes the row to the left. override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? { let deleteAction = UITableViewRowAction( style: UITableViewRowActionStyle.Normal, title: "Delete", handler: deleteHandler); deleteAction.backgroundColor = UIColor.redColor() let editAction = UITableViewRowAction( style: UITableViewRowActionStyle.Normal, title: "Edit", handler: editHandler); editAction.backgroundColor = UIColor.grayColor() return [deleteAction, editAction] } // Handles the delete action when the users swipes the row to the left. func editHandler(action: UITableViewRowAction!, indexPath: NSIndexPath!) -> Void { // Option 1 //performSegueWithIdentifier("EditItem", sender: nil) //Option 2 - This does not work. let myViewController = ItemViewController() let selectedItem = self.items[indexPath.row] // I have an array of 'items' myViewController.item = selectedItem self.presentViewController(myViewController, animated: true, completion: nil) } // Handles the delete action when the users swipes the row to the left. func deleteHandler(action: UITableViewRowAction!, indexPath: NSIndexPath!) -> Void { self.games.removeAtIndex(indexPath.row) tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) } 

我怎样才能传递数据到我的视图控制器在“editHandler”方法? 我可以使用segue整天显示视图控制器,但是我希望它可以在表格中加载选定的项目,以便用户可以修改它。

谢谢!

使用Option1。 您可以通过发件人传递数据。

 let selectedItem = self.items[indexPath.row] // I have an array of 'items' performSegueWithIdentifier("EditItem", sender: selectedItem) override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "EditItem" { let itemViewController = segue.destinationViewController as! ItemViewController if let item = sender as? Item { itemViewController.item = item } } } 

选项1或选项2使用相同的技术来传递数据,即创build一个新的itemViewController实例并为其分配项目。

你的代码在选项2看起来很好,问题是,你是什么意思的“不工作”? 你可以添加断点

myViewController.item = selectedItem

并打印出myViewControlleritem ,看看是否你想要的东西。 然后在myViewControllerviewDidLoad方法中,检查item是否仍然有效。

如果一切都很好,你应该是好的。

我想,你的问题不是

  //Option 2 - This does not work. let myViewController = ItemViewController() let selectedItem = self.items[indexPath.row] // I have an array of 'items' myViewController.item = selectedItem self.presentViewController(myViewController, animated: true, completion: nil) } 

我确定这是正确的。 我也是
在你的myViewController中,你尝试在viewdidload中打印项目来检查它是否有数据?

所以我从一个发现,我有一个不同的问题,然后我最初的想法,以及在这篇文章中的信息的组合发现问题: Swift presentViewController

我的视图控制器embedded在导航控件中,创build视图控制器时需要额外的一些设置。 我必须在视图控制器Identity Inspector(我分配了“EditItem”的id)中分配一个“Storyboard ID”,然后我必须用该ID实例化视图控制器并将其embedded到导航控制器中。

  let itemViewController = self.storyboard?.instantiateViewControllerWithIdentifier("EditItem") as! ItemViewController itemViewController.item = self.items[indexPath.row] let navigationController = UINavigationController(rootViewController: itemViewController) self.presentViewController(navigationController, animated: true, completion: nil)