2017-02-27 68 views
1

我有子類UITableViewCell。在這裏,我做了一個按鈕的出口。當該按鈕被點擊時,它應該在不同的ViewController中執行一個函數。我曾經嘗試這樣做:如何在UITableViewCell中爲不同的ViewController設置UIButton的IBAction?

override func awakeFromNib() { 
    super.awakeFromNib() 
    reloadTableView.addTarget(self, action: #selector(multiplayerChannelView.tappedOnReloadTableView), for: .touchUpInside) 
} 

然而,這種崩潰,出現此錯誤:

[test.CreateChannelCell tappedOnReloadTableView]:無法識別的選擇發送到實例0x7fc1198b5200

的功能存在,沒有錯字。爲什麼這不起作用?這個問題看起來是一樣的,只有它不是寫在迅速3.0 How to set Action for UIButton in UITableViewCell

multiplayerChannelView是持有UITableView的viewcontroller。我用UITableViewCell subclassed得到了一個分離的.swift文件。

+0

是'multiplayerChannelView'是你的控制器您身在何處的tableView填充數據? –

+0

Yesssssssssssss – NoKey

回答

4

中的cellForRowAtIndexPath

cell.your_button.addTarget(self, action: #selector(self.tappedButton(sender:)), for: .touchUpInside); 
在同一UIVeiwController

,隨時隨地添加此定義函數如下

func tappedButton(sender : UIButton){ 
// Your code here 
} 
+0

我得到的類型UITableViewCell的錯誤值沒有成員X.但是,我已經在我的UITableViewCell中設置了一個插座。 – NoKey

+0

cell.your_button.addTarget(self,action:#selector(self.tappedButton(sender :)),for:.touchUpInside); – Moin

+0

謝謝,最短的答案是有效的。 – NoKey

1

寫下面的代碼文件VC2

import UIKit 
class tblCell : UITableViewCell 
{ 

@IBOutlet weak var btnAction: UIButton! 
@IBAction func btnAction(_ sender: AnyObject) 
{ 
    print(sender.tag) // you can identify your cell from sender.tag value 

    // notification is fire here and call notification from VC1 
    NotificationCenter.default.post(name:NSNotification.Name(rawValue: "buttonAction"), object: nil) 
} 
} 

class VC2: UIViewController,UITableViewDelegate,UITableViewDataSource 
{ 

@IBOutlet weak var tblview: UITableView! 
override func viewDidLoad() { 
    super.viewDidLoad() 
    tblview.delegate = self 
    tblview.dataSource = self 
    // Do any additional setup after loading the view. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 


// MARK: - Table veiw 
func tableView(_ tblBlog: UITableView, numberOfRowsInSection section: Int) -> Int { 

    return 10 

} 

func tableView(_ tblBlog: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
{ 

    let cell : tblCell = tblview.dequeueReusableCell(withIdentifier: "Cell") as! tblCell 

    cell.btnAction.tag = indexPath.row 

    return cell 
    // 
} 

} 

寫下面的代碼文件VC1

class VC1: UIViewController { 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 
} 
override func viewWillAppear(_ animated: Bool) 
{ 
    // this notification is call when it fire from VC2 
    NotificationCenter.default.addObserver(self, selector: #selector(ButtonClick), name: NSNotification.Name(rawValue: "buttonAction"), object: nil) 
} 
func ButtonClick() 
{ 
    // code when button is clicked you wanto perfrom 
} 
} 
+0

不,這不是它是如何工作的我得到所有類型的錯誤 – NoKey

+0

請嘗試在你的答案給予更多細節 - 代碼片段將有所幫助 –

1

您可以通過在你的tableViewCell類創建delegate做到這一點。

protocol CustomTableViewCellDelegate { 
func buttonPressed() 
} 

然後初始化委託象下面這樣的tableViewCell

var delegate: CustomTableViewCellDelegate? 

並把下面的代碼在你的tableViewCell

@IBAction func cellButtonPressed (sender : UIButton) { 
      if (self.delegate != nil) { 
       self.delegate?.buttonPressed() 
    } 

在按鈕點擊請檢查是否委託按鈕動作不爲零,請在cellForRowAtIndex方法中設定cell.delegate = self方法

在最後只需添加代碼按鈕動作在你的類,你必須使用customTableViewCell

extension ViewController : CustomTableViewCellDelegate { 
     func buttonPressed() { 
      // Perfom your code on button action 
     } 
} 

CustomTableViewCellDelegate看起來象下面這樣:

import UIKit 

protocol CustomTableViewCellDelegate { 
    func buttonPressed() 
} 

class CustomTableViewCell: UITableViewCell { 

    var delegate: CustomTableViewCellDelegate? 


    override func awakeFromNib() { 
     super.awakeFromNib() 
     // Initialization code 
    } 

    override func setSelected(_ selected: Bool, animated: Bool) { 
     super.setSelected(selected, animated: animated) 

     // Configure the view for the selected state 
    } 

    @IBAction func cellButtonPressed (sender : UIButton) { 
     if (self.delegate != nil) { 
      self.delegate?.buttonPressed() 
    } 

} 

希望它能爲你工作!

+0

我不知道在哪裏把所有的功能。當我嘗試添加cell.delegate = self時,我得到一個錯誤:類型UITableViewCell的值沒有成員'委託'。在哪裏把var委託,在什麼VC?以及在哪裏放置IBAction功能?我試圖在兩個viewcontrollers中添加var委託,仍然沒有運氣 – NoKey

+0

@JasperVisser我已經更新了我的答案 –

相關問題