skip to Main Content

i have a view controller in which there is a tableview cell having button on it. Button with title add comments. when i click on add comments button then it take me to the next page where textfield is present when i write something in it then press done button then my button title for all the cell changes. But i want only selected row button title should change. Below is my code of table view.

class MyTabViewController: UIViewController {
    var addCommentsValueStore: String = "Add Comments"
    @IBOutlet weak var tabTableView : ContentWrappingTableView!

    @IBAction func addCommentsAction(_ sender: UIButton) {
        guard let nextVC = MyCommentsRouter.getMyCommentsViewScreen() else { return }
        nextVC.passAddCommentsDelegate = self
        self.navigationController?.pushViewController(nextVC, animated: true)

    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
   let indetifier =  "MyTabTableViewCell"
            let cell = tableView.dequeueReusableCell(withIdentifier: indetifier, for: indexPath) as! MyTabTableViewCell
cell.addCommentsButton.setTitle(addCommentsValueStore, for: UIControl.State.normal)
}
}

extension MyTabViewController: AddCommentsDelegate{
    func passAddComments(instruction: String) {
        addCommentsValueStore = instruction
        print(addCommentsValueStore)
    }
}

below is the code of next view controller:

import UIKit
protocol AddCommentsDelegate{
    func passAddComments(instruction: String)
}

class MyCommentsViewController: UIViewController {
    
    @IBOutlet var addCommentsTextField: UITextField!
 var passAddCommentsDelegate: AddCommentsDelegate?
    override func viewDidLoad() {
        super.viewDidLoad()

        
    }
    
    @IBAction func backActionClick(_ sender: UIButton) {
//        guard let nextVC = MyTabRouter.getMyTabViewScreen() else { return }
        self.navigationController?.popViewController(animated: true)
    }
    
    @IBAction func DoneActionClick(_ sender: Any) {
        let dataToBeSent = addCommentsTextField.text
        self.passAddCommentsDelegate?.passAddComments(instruction: dataToBeSent!)
        self.navigationController?.popViewController(animated: true)
    }
    
}

2

Answers


  1. You can do it in this delegate method as below:

    -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    for (id object in cell.superview.subviews) {
        if ([object isKindOfClass:[UITableViewCell class]]) {
            UITableViewCell *cellNotSelected = (UITableViewCell*)object;
            cellNotSelected.textLabel.textColor = [UIColor blackColor];
        }
    }
    
    cell.textLabel.textColor = [UIColor redColor];
    
    [tableView deselectRowAtIndexPath:indexPath animated:NO];
    

    }

    Login or Signup to reply.
  2. you need to change you logic for done those things. First you need to declare string Wrong. Because string only hold a single value. You need to declare variable as Dictionary [IndexPath:String] Or AnyHashable Dictionary for store the value. I will give reference code below feel free to refer and if any doubt in the code please ask me in command

    Reference Code

    import UIKit
    
    class FirstViewController: UIViewController {
      
      @IBOutlet weak var tableView: UITableView!
      var commend: [IndexPath: String] = [:]
      
    }
    
    extension FirstViewController: UITableViewDelegate, UITableViewDataSource{
      
      func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 10
      }
      
      func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: ListTableViewCell.self), for: indexPath) as! ListTableViewCell
        cell.button.setTitle(commend[indexPath] ?? "Add commend", for: .normal)
        cell.label.text = "(indexPath.row)"
        cell.button.addTarget(self, action: #selector(self.addCommentsAction(_:)), for: .touchUpInside)
        return cell
      }
      
      @objc func addCommentsAction(_ sender: UIButton) {
        guard let nextVC = UIStoryboard(name: "Main", bundle: .some(.main)).instantiateViewController(withIdentifier: String(describing: CommendViewController.self)) as? CommendViewController else { return }
        let buttonPosition:CGPoint = sender.convert(CGPoint.zero, to: self.tableView)
        guard let indexPath = self.tableView.indexPathForRow(at: buttonPosition) else{
          return 
        }
        nextVC.delegate = self
        nextVC.indexPath = indexPath
        self.navigationController?.pushViewController(nextVC, animated: true)
      }
      
    }
    
    extension FirstViewController: DataPassingDelegate{
      func commendForIndex(_ string: String, indexPath: IndexPath) {
        self.commend[indexPath] = string
        self.tableView.reloadData()
      }
    }
    
    class ListTableViewCell: UITableViewCell{
      @IBOutlet weak var label: UILabel!
      @IBOutlet weak var button: UIButton!
    }
    
    
    protocol DataPassingDelegate: AnyObject {
      func commendForIndex(_ string: String, indexPath: IndexPath)
    }
    
    class CommendViewController: UIViewController {
    
      @IBOutlet weak var textView: UITextView!
    
      weak var delegate: DataPassingDelegate?
      var indexPath = IndexPath()
      
      @IBAction func doneCommend(_ sender: UIButton){
        self.delegate?.commendForIndex(textView.text, indexPath: indexPath)
        self.navigationController?.popViewController(animated: true)
      }
        
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search