2017-06-19 35 views
0

我很难通过自定义单元格中的按钮传递数据。所以我有一个自定义单元,它有一个按钮。在细胞的TableViewCell,按钮被宣布自定义单元格中的按钮传递信息

@IBOutlet var UserEdit: RoundButton! 

然后在具有自定义单元格中的ViewController,按钮被赋予一个动作。

@IBAction func EditClicked(_ sender: UIButton) -> Void { 

     let indexPath = self.selectedIndex 
     performSegue(withIdentifier: "EditPost", sender: indexPath) 


    } 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "Cells", for: indexPath) as! ProfileTableViewCell 

cell.UserEdit.addTarget(self, action: #selector(EditClicked), for: UIControlEvents.touchUpInside) 
     cell.UserEdit.tag = indexPath.row 
     print(indexPath.row) 
     cell.UserEdit.isUserInteractionEnabled = true 
} 

而且SEGUE完美的作品,不过,我会想通过该按钮被点击的细胞的信息,因此我这样做:

override public func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    guard segue.identifier == "Hello", let chatVc = segue.destination as? SendMessageViewController else { 
     return 
    } 

    chatVc.senderId = self.loggedInUser?.uid 
    chatVc.receiverData = self.userpicuid 
    chatVc.senderDisplayName = self.userpicuid 
    chatVc.username = self.username 

      if segue.identifier == "EditPost" { 

      if let indexPath = sender as? IndexPath { 
       let vc = segue.destination as! EditPostViewController 
       let post = self.posts[indexPath.row] as! [String: AnyObject] 
       let Booked = post["title"] as? String 
       let Authors = post["Author"] as? String 
       let ISBNS = post["ISBN"] as? String 
       let Prices = post["Price"] as? String 
       let imageNames = post["image"] as? String 
       vc.Booked = Booked 
       vc.Authors = Authors 
       vc.ISBNS = ISBNS 
       vc.Prices = Prices 
       vc.imageNames = imageNames 

       print(indexPath.row) 
      } 
     }} 

而在目标视图控制器,我有这个:

@IBOutlet var Author: UITextField! 
    @IBOutlet var Price: UITextField! 

    @IBOutlet var Books: UIImageView! 
    @IBOutlet var ISBN13: UITextField! 

    @IBOutlet var ISBN10: UITextField! 
    @IBOutlet var CoverType: UITextField! 
    @IBOutlet var Details: UITextField! 

var Booked: String? 
    var Authors: String? 
    var ISBNS: String? 
    var Prices: String? 
    var imageNames: String? 

override func viewDidLoad() { 
     super.viewDidLoad() 

     self.BookTitle.text = self.Booked 
     self.Author.text = self.Authors 
     self.ISBN10.text = self.ISBNS 
     self.Price.text = self.Prices 
} 

但是,当我点击按钮时没有信息被传递。目标视图控制器中的文本字段为空。

+1

你怎么了'selectedIndex' –

+1

您可以选择使用协议委托或关闭传递数据。 –

+0

@安布。Karthik var selectedIndex:IndexPath? – juelizabeth

回答

3

请按照以下步骤来简化您的任务。 首先在UITableViewCell类中定义按钮属性像刚才娄功能..

override func setSelected(_ selected: Bool, animated: Bool) { 
    super.setSelected(selected, animated: animated) 
    // Configure the view for the selected state 
} 

加入这一行

var editBtnClickFunction: (() -> Void)? = nil 

此行后添加一点代码到您的按钮点击这样的动作。

if let onButtonTapped = self. editBtnClickFunction { 
     onButtonTapped() 
    } 

在你的主控制器现在就从你正在使用UITableViewDataSourceDelegate

其中里面你cellForRowAt功能您return cell语句前加上一个这样的其它代码

cell. editBtnClickFunction = { 
    performSegue(withIdentifier: "EditPost", sender: indexPath.row) 
} 

现在,它在你的赛格瑞最终代码编制方法

if segue.identifier == "EditPost" { 
if sender != nil { 
let index : Int = Int(sender! as! String) 
      let vc = segue.destination as! EditPostViewController 
      let post = self.posts[index] as! [String: AnyObject] 
      let Booked = post["title"] as? String 
      let Authors = post["Author"] as? String 
      let ISBNS = post["ISBN"] as? String 
      let Prices = post["Price"] as? String 
      let imageNames = post["image"] as? String 
      vc.Booked = Booked 
      vc.Authors = Authors 
      vc.ISBNS = ISBNS 
      vc.Prices = Prices 
      vc.imageNames = imageNames 
     } 
    } 

希望这将帮助你

+0

它可悲的没有工作,但感谢您的努力 – juelizabeth

+0

@juelizabeth你能告诉我你在哪里卡住在那 –

+0

我确实做了你发布的内容,但是我得到和我的问题一样的结果。没有数据通过,当我尝试检查数据是否通过打印(预订)传递时,它什么都不打印 – juelizabeth

1

变化这一行如下

cell.UserEdit.addTarget(self, action: #selector(EditClicked(sender:)), for: UIControlEvents.touchUpInside) 

和改变目标方法声明如下

@IBAction func EditClicked(sender: UIButton) -> Void { 

    let indexPath = self.selectedIndex 
    performSegue(withIdentifier: "EditPost", sender: indexPath) 


} 

尝试改变如上述的代码。

+0

我做了,但它仍然没有工作,我包括一个打印语句和selectedRow = 0(我只有一个单元格) – juelizabeth

+0

尝试删除@IBAction函数定义(可能听起来很愚蠢,但尝试) – jegadeesh

+0

它没有做出改变。我更新了我的'override public func prepare(for segue:UIStoryboardSegue,sender:Any?){'在我的问题中,因为它们是它的其他细节,我不确定这是什么使细节继续工作 – juelizabeth

相关问题