如何从 Swift 中的 UITableViewRowAction 向 UIViewController 传递数据?
Posted
技术标签:
【中文标题】如何从 Swift 中的 UITableViewRowAction 向 UIViewController 传递数据?【英文标题】:How to pass data to a UIViewController from a UITableViewRowAction in Swift? 【发布时间】:2015-12-02 03:32:54 【问题描述】:我是 ios 编程的新手,我一直在寻找如何做到这一点,但似乎找不到我想要的东西。我认为这将是一项相当容易的任务,我相信如果有人能启发我的话。
当您在表格视图上向左滑动时,我可以执行一些自定义操作。其中一项操作是对所选项目的简单“编辑”。我要做的就是显示另一个视图控制器,但将一些数据传递给该视图控制器,就像它通常在 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 整天显示视图控制器,但我希望它与表中的选定项目一起加载,以便用户可以修改它。
谢谢!
【问题讨论】:
【参考方案1】:使用选项 1。您可以通过发件人传递数据。
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
【讨论】:
【参考方案2】:选项 1 或选项 2 都使用相同的技术来传递数据,即创建一个新的 itemViewController 实例并将项目分配给它。
您的代码在选项 2 中似乎很好,问题是,您所说的“不起作用”是什么意思?您可以在
处添加断点myViewController.item = selectedItem
并打印出myViewController
和item
看看它们是否是你想要的。然后在myViewController
的viewDidLoad
方法中,检查item
是否仍然有效。
如果一切都很好,你应该很好。
【讨论】:
对不起,“这不起作用”我的意思是,在我调用 presentViewController(...) 之后, myViewController 的 viewDidLoad() 方法被调用但属性为零(即@IBOutlet weak var itemTextField: UITextField!)并且它不会在模拟器中加载(只是黑屏)。 “项目”已填充,因此数据确实通过了,但它没有像在 prepareForSegue(...) 中那样正确构造视图控制器,它可以在新的“item”是通过我在 Interface Builder 中发送的“AddItem”segue 添加的。 那么这完全是一个不同的问题。似乎您的视图控制器设置不正确。您应该首先检查您的 itemViewController。如果你 push 或者只是将根视图控制器设置为 itemViewController,你能看到 UI 吗?如果您无法处理,请发布您的代码和您的 xib 或故事板的屏幕截图,以便我们知道。【参考方案3】:我认为,你的问题不是
//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 中打印项目以检查它是否有数据?
【讨论】:
【参考方案4】:所以我发现我遇到了与我最初想的不同的问题,并结合了这篇文章中的信息:Swift presentViewController
我的视图控制器嵌入在导航控件中,这需要在创建视图控制器时进行一些额外的设置。我必须在视图控制器 Identity Inspector 中分配一个“Storyboard ID”(我分配了“EditItem”的 id),然后我必须用该 ID 实例化视图控制器并将其嵌入到导航控制器中......
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)
【讨论】:
以上是关于如何从 Swift 中的 UITableViewRowAction 向 UIViewController 传递数据?的主要内容,如果未能解决你的问题,请参考以下文章