【问题标题】:How to pass data to a UIViewController from a UITableViewRowAction in Swift?如何从 Swift 中的 UITableViewRowAction 向 UIViewController 传递数据?
【发布时间】: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 整天显示视图控制器,但我希望它与表中的选定项目一起加载,以便用户可以修改它。

谢谢!

【问题讨论】:

    标签: ios swift2 tableview viewcontroller


    【解决方案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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-10-23
          • 2018-07-14
          • 2018-03-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-26
          • 1970-01-01
          相关资源
          最近更新 更多