使用委托将数据从一个TableView传输到另一个

joe*_*oey 5 xcode delegates uitableview ios swift

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

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

    let indexPath = tableView.indexPathForCell(cell)
Run Code Online (Sandbox Code Playgroud)

上面的代码可以在单击按钮时获取单元格的索引路径,但是为了传输数据,我必须使用prepareForSegue。因此,我自然会尝试使用segue进行准备并更改senderfrom AnyObject?至MyButton

然后,我收到一条错误消息,提示“ 使用选择器prepareforsegue的重写方法具有不兼容的type”

delegates迅速搜索并了解了这些内容以及它们如何提供帮助,并在此处尝试了MakeAppPie给出的答案:

代表们迅速?但这对我没有用。

有什么方法可以将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!]
      }
Run Code Online (Sandbox Code Playgroud)

Ale*_*xZd 3

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

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

var row = self.tableView.indexPathForSelectedRow()?.row
Run Code Online (Sandbox Code Playgroud)

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

如果您需要处理按钮内部的某些操作,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)
    }
}
Run Code Online (Sandbox Code Playgroud)

在你的里面UIViewController

class MyViewController : UIViewController, MyTableViewCellDelegate {
Run Code Online (Sandbox Code Playgroud)

...

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
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您需要通过手机点击执行相同的操作,则无需此协议内容,这将非常简单。