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

时间:2015-09-05 06:04:48

标签: ios xcode swift uitableview delegates

我需要点击tableview内的按钮,将字符串从一个UITableView转移到另一个indexPath。我知道如何通过按钮获取 let button = sender as MyButton let view = button.superview! let cell = view.superview as! MyTableViewCell let indexPath = tableView.indexPathForCell(cell) ,如下所示:

prepareForSegue

上面的代码用于在单击按钮时获取单元格的索引路径,但是为了传输数据,我必须使用sender。所以很自然地我尝试使用准备segue并从AnyObject更改MyButton?到delegates

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

我在swift中搜索并阅读了 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!] } 以及这些如何提供帮助,我尝试了MakeAppPie给出的答案:

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

有没有办法将segue的准备和上面的代码结合起来?我尝试了这个,但它导致了我刚才提到的错误信息:

  select * from emp where Action ='D' OR Deptno='' OR Deptno is null

2 个答案:

答案 0 :(得分:2)

我不确定我是否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
    }
}

如果您需要通过单元格点击进行相同的操作,那么如果没有此协议的话,它将会非常简单。

答案 1 :(得分:0)

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

我不确定Apple在提交时是否会持续/接受它(可能是使用标签作为按钮滥用UI元素?),但暂时还可以。