使用委托将数据从一个TableView中转移到另一个

问题描述:

我需要通过点击一个按钮,是UITableView内的字符串从一个tableview转移到另一个。我知道如何通过一个按钮来获得indexPath,像这样:使用委托将数据从一个TableView中转移到另一个

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

    let indexPath = tableView.indexPathForCell(cell) 

上面的代码工作,以获得细胞的indexpath点击一个按钮,zhowever为了传输数据,我不得不使用prepareForSegue 。所以自然我试着用准备for segue并从AnyObject改变sender?到MyButton

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

我搜索并阅读关于迅速和delegates如何将这些能帮助,我试图通过MakeAppPie这里给出了答案:

Delegates in 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!] 
     } 

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

在情况下,如果您需要做同样的事情,但通过细胞攻丝,它将muc h简单,没有这个协议的东西。

+0

这是更接近,但仍不完全它。唯一的问题是我需要传输的字符串在视图控制器中。它是一个数组中的索引,并且该数组仅存在于视图控制器中。在该溶液中的字符串是在这里: @IBAction FUNC buttonTapped(发件人:AnyObject){ 令字符串= “” self.delegate.actionButtonTapped(字符串) } 因此字符串仍然不能转移 – joey

+0

@joey,你可以添加一个属性到你的单元类,并在cellForRowAtIndexPath方法中分配它。通常您需要将对象传递给UITableViewCell类,并在单元类中进行一些映射。所以你可以在单元格内获得对象(或对象属性)。 – AlexZd

我找到了解决的答案/工作。我没有使用UIButton来执行segue,而是使用了一个标签,所以当我点击标签时,它被注册为在tableview单元格上的点击。这使我可以通过点击来获取索引路径,同时也可以正确使用准备传输所需的数据。

我不知道这是否会持续/可以接受苹果每当我提交(通过使用标签,按钮或者UI元素的滥用?),但暂时它的工作原理。

+0

我认为它适用于Apple。如果你想让它成为UIButton(如果你仍然需要一些按钮功能)而不是UILabel,你可以关闭IB的按钮的userInteraction。你会得到相同的结果。但用这种方式,如果用户点击单元格中的任何位置,它也可以工作。 – AlexZd

+0

好的谢谢你的提示。即使其他答案也没有完全回答我提出的问题,因为它清楚地解释了如何创建和使用委托(我之前并不了解)。 – joey