简体   繁体   中英

Delegate always nil in tableviewcontroller

I am trying to pass data from my tableViewController to my ProfileViewController. so when i clicked cell, then my profile textfield will set the text to the cell that i clicked before.

This is my TableViewController .

protocol TableViewDelegate {
func clickedTableViewCell(info: String)
}

class ProfilePlaceTableViewController : UITableViewController {

var delegate: TableViewDelegate!

@IBOutlet var tableViewProfile: UITableView!

let foods = ["tomato", "red", "rice", "milk", "cheese"]

override func viewDidLoad() {
    super.viewDidLoad()

    tableViewProfile.delegate = self
    tableViewProfile.dataSource = self
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return foods.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
    cell.textLabel?.text = foods[indexPath.row]
    return cell
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    if (tableView.cellForRow(at:indexPath)?.accessoryType == UITableViewCellAccessoryType.checkmark)  {
        tableView.cellForRow(at: indexPath)?.accessoryType = UITableViewCellAccessoryType.none
    } else {
        tableView.cellForRow(at:indexPath)?.accessoryType = UITableViewCellAccessoryType.checkmark
    }

    //getting the index path of selected row
    let indexPath = tableView.indexPathForSelectedRow

    //getting the current cell from the index path
    let currentCell = tableView.cellForRow(at: indexPath!)! as UITableViewCell

    //getting the text of that cell
    let currentItem = currentCell.textLabel!.text

    print("currentItem : ", currentItem!)

    if (delegate != nil) {
        self.delegate?.clickedTableViewCell(info: currentItem!)
        self.dismiss(animated: true, completion: nil)
    }
}

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
}

override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
    return UITableViewAutomaticDimension
}

}

This is my profileViewController .

class ProfileViewController : UIViewController, TableViewDelegate {

@IBOutlet weak var provinceText: kTextFiledPlaceHolder!   

var profilePlaceTableViewController = ProfilePlaceTableViewController()

func clickedTableViewCell(info: String) {
    provinceText.text = info
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showProfilePlace" {
        let showProfileVc: ProfilePlaceTableViewController = segue.destination as! ProfilePlaceTableViewController
        showProfileVc.delegate = self
    }
}

override func viewDidLoad() {

    let button = UIButton.init(type: .custom)
    button.setImage(UIImage.init(named: "ic_hamburger_menu"), for: UIControlState.normal)
    button.setTitleColor(UIColor.black, for: .normal)
    button.addTarget(self.revealViewController(), action:#selector(SWRevealViewController.revealToggle(_:)), for: UIControlEvents.touchUpInside)
    button.sizeToFit()
    button.imageEdgeInsets = UIEdgeInsetsMake(4, 4, 4, 4)
    let barButton = UIBarButtonItem.init(customView: button)
    self.navigationItem.leftBarButtonItem = barButton

    self.view.addGestureRecognizer(self.revealViewController().tapGestureRecognizer())
    self.view.addGestureRecognizer(self.revealViewController().panGestureRecognizer())

    provinceText.addTarget(self, action: #selector(provinceClicked(_:)), for: .touchDown)

    profilePlaceTableViewController.delegate = self

    super.viewDidLoad()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

func provinceClicked(_ textField: UITextField) {        
    performSegue(withIdentifier: "showProfilePlace", sender: nil)
}

I have done all this and follow many tutorials but still no solution. Any help would be appreciated. Thank you.

You've declared your delegate ( TableViewDelegate ) as non-optional , but in the didSelect method, you're using optional chaining - self.delegate?.clickedTableViewCell(info: currentItem!)

Declare your delegate as weak optional property - weak var delegate: TableViewDelegate? = nil weak var delegate: TableViewDelegate? = nil to avoid retain cycle.

Delete your profilePlaceTableViewController.delegate = self . You're doing the same in your performSegue method.

And change your protocol declaration to:

protocol TableViewDelegate: class { 
    func clickedTableViewCell(info: String) 
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM