【问题标题】:Using delegates to transfer data from one TableView to another使用委托将数据从一个 TableView 传输到另一个
【发布时间】:2015-09-05 06:04:47
【问题描述】:

我需要通过单击UITableView 内的按钮将字符串从一个tableview 传输到另一个。我知道如何通过按钮获取indexPath,如下所示:

    let button = sender as MyButton
    let view = button.superview!
    let cell = view.superview as! MyTableViewCell

    let indexPath = tableView.indexPathForCell(cell)

上面的代码可以在单击按钮时获取单元格的索引路径,但是为了传输数据,我必须使用prepareForSegue。所以很自然地,我尝试使用 prepare for segue 并将 senderAnyObject 更改?给MyButton

然后我收到一条错误消息,说“使用选择器prepareforsegue覆盖方法的类型不兼容。”

我在 swift 中搜索并阅读了有关 delegates 以及这些内容如何提供帮助的信息,我在这里尝试了 MakeAppPie 给出的答案:

Delegates in swift? 但它对我不起作用。

有没有什么方法可以将准备 segue 和我上面的代码结合起来?我试过这个,但它导致了我上面提到的错误消息:

      override func prepareForSegue(segue: UIStoryboardSegue, sender: MyButton)  {

      let myVC = segue.destinationViewController as? CommentsViewController


                   let usender:AnyObject = sender!
                    let button = usender as? MyButton
                    let view = button.superview!
                    myVC!.title = button.titleForState(.Normal)

                    let cell = view.superview as! QuestionCell


                    let indexPath = tableView.indexPathForCell(cell)

                    println(self.short_descriptionArray)

                    var row = self.tableView.indexPathForSelectedRow()?.row
                    myVC!.nameToGet = short_descriptionArray[row!]
      }

【问题讨论】:

    标签: ios xcode swift uitableview delegates


    【解决方案1】:

    我不确定我是否能 100% 帮助你,但我会尽力帮助你。

    无需更改prepareForSegue: 方法。你可以从AnyObject得到你需要的东西。我也认为你会在这里得到空的结果:

    var row = self.tableView.indexPathForSelectedRow()?.row
    

    因为点击您的按钮不会选择您的单元格。

    如果您需要从 UITableViewCell 内的按钮处理某些操作,则需要在单元格类中添加:

    protocol MyTableViewCellDelegate : NSObjectProtocol {
        func actionButtonTapped(string:String)
    }
    
    class MyTableViewCell: UITableViewCell {
        var delegate : MyTableViewCellDelegate!
        @IBAction func buttonTapped(sender: AnyObject) {
            let string = "<your string>"
            self.delegate.actionButtonTapped(string)
        }
    }
    

    在你的UIViewController

    class MyViewController : UIViewController, MyTableViewCellDelegate {
    

    ...

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        ...
        cell.delegate = self
        ...
        return cell
    }
    
    func actionButtonTapped(string:String) {
        self.performSegueWithIdentifier("segueIdentifier", sender: string)
    }
    
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if let myVC = segue.destinationViewController as? CommentsViewController {
            myVC.nameToGet = sender as! String
        }
    }
    

    如果你需要做同样的事情,但通过点击单元格,它会很简单,没有这个协议的东西。

    【讨论】:

    • 这更接近,但仍然不完全正确。唯一的问题是我需要传输的字符串在视图控制器中。它是数组中的索引,并且数组只存在于视图控制器中。在这个解决方案中,字符串在这里:@IBAction func buttonTapped(sender: AnyObject) { let string = "" self.delegate.actionButtonTapped(string) } 所以字符串仍然无法传输
    • @joey 您可以将属性添加到您的单元格类并在 cellForRowAtIndexPath 方法中分配它。通常你需要将你的对象传递给 UITableViewCell 类并在单元格类中做一些映射。因此,您可以在单元格中获取对象(或对象属性)。
    【解决方案2】:

    我找到了答案/解决方法。我没有使用UIButton 来执行segue,而是使用了一个标签,所以当我点击标签时,它被注册为对tableview 单元格的点击。这使我可以通过单击获取索引路径,并且还可以正确使用 prepare for segue 来传输所需的数据。

    我不确定这是否会在我提交时持续/是否被 Apple 接受(可能是通过将标签用作按钮来滥用 UI 元素?),但目前它可以工作。

    【讨论】:

    • 我认为它适用于 Apple。如果您希望它是 UIButton(如果您仍然需要一些按钮功能)而不是 UILabel,您可以关闭 IB 中按钮的 userInteraction。你会得到同样的结果。但是如果用户点击单元格中的任何位置,它也可以工作。
    • 好的,谢谢你的提示。甚至另一个答案也没有完全回答我赞成的问题,因为它确实清楚地解释了如何创建和使用委托(我以前不明白)。
    猜你喜欢
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 2020-10-11
    • 2017-04-16
    • 1970-01-01
    • 2016-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多