委托总是在tableviewcontroller中为nil

时间:2017-09-22 11:14:34

标签: ios string swift3

我正在尝试将数据从tableViewController传递到我的ProfileViewController。因此,当我单击单元格时,我的配置文本文本字段将文本设置为我之前单击的单元格。

这是我的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
}

}

这是我的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)
}

我已完成所有这些并遵循许多教程,但仍然没有解决方案。任何帮助,将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:0)

您已将您的代理人( TableViewDelegate )声明为非可选,但在self.delegate?.clickedTableViewCell(info: currentItem!)方法中,您正在使用< em>可选链接 - weak var delegate: TableViewDelegate? = nil

将您的委托声明为弱可选属性 - profilePlaceTableViewController.delegate = self以避免保留周期。

删除performSegue。您在protocol TableViewDelegate: class { func clickedTableViewCell(info: String) } 方法中也是如此。

将您的协议声明更改为:

res.redirect(url.format({
        pathname: "https://www.getpostman.com/oauth2/callback",
        query: {
            code: `AUTHORIZATION_CODE`
        }        
 }));