如何从 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

并打印出myViewControlleritem 看看它们是否是你想要的。然后在myViewControllerviewDidLoad方法中,检查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 传递数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 iOS 中的流中接收数据(swift)

如何从 Swift 中的主线程中关闭

如何从 Swift 4 中的描述中解析数组?

如何从 Swift 3 中的数据中读取属性列表

如何从目标 c 中的 pod 文件访问我的 swift 项目文件?

如何从 Swift 中的 NSURLResponse 中检索 cookie?