2015-09-05 62 views
4

我需要通過點擊一個按鈕,是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!] 
     } 

回答

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 
    } 
} 

在情況下,如果您需要做同樣的事情,但通過細胞攻絲,它將muc h簡單,沒有這個協議的東西。

+0

這是更接近,但仍不完全它。唯一的問題是我需要傳輸的字符串在視圖控制器中。它是一個數組中的索引,並且該數組僅存在於視圖控制器中。在該溶液中的字符串是在這裏: @IBAction FUNC buttonTapped(發件人:AnyObject){ 令字符串= 「」 self.delegate.actionButtonTapped(字符串) } 因此字符串仍然不能轉移 – joey

+0

@joey,你可以添加一個屬性到你的單元類,並在cellForRowAtIndexPath方法中分配它。通常您需要將對象傳遞給UITableViewCell類,並在單元類中進行一些映射。所以你可以在單元格內獲得對象(或對象屬性)。 – AlexZd

0

我找到了解決的答案/工作。我沒有使用UIButton來執行segue,而是使用了一個標籤,所以當我點擊標籤時,它被註冊爲在tableview單元格上的點擊。這使我可以通過點擊來獲取索引路徑,同時也可以正確使用準備傳輸所需的數據。

我不知道這是否會持續/可以接受蘋果每當我提交(通過使用標籤,按鈕或者UI元素的濫用?),但暫時它的工作原理。

+0

我認爲它適用於Apple。如果你想讓它成爲UIButton(如果你仍然需要一些按鈕功能)而不是UILabel,你可以關閉IB的按鈕的userInteraction。你會得到相同的結果。但用這種方式,如果用戶點擊單元格中的任何位置,它也可以工作。 – AlexZd

+0

好的謝謝你的提示。即使其他答案也沒有完全回答我提出的問題,因爲它清楚地解釋瞭如何創建和使用委託(我之前並不瞭解)。 – joey

相關問題