iOS Swift:在自定义Tableview单元格中将视图推送到堆栈

时间:2017-03-03 00:27:39

标签: ios iphone uitableview swift3

我在VC中有一个带有导航控制器的桌面视图,它包含自定义表格单元格。我想知道如果点击自定义表格单元格中的按钮,推送到父VC导航堆栈的最佳做法是什么。如果我将父VC的导航控制器传递给单元,我能够使其工作;但这是最有效/最有效的做法吗?请参阅我目前的实施情况:

UserAccountVC:

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

        let cell:TextPostTableViewCell = Bundle.main.loadNibNamed("TextPostTableViewCell", owner: self, options: nil)?.first as! TextPostTableViewCell

        cell.setupCell(navigationController: self.navigationController!)

        cell.selectionStyle = .none

        return cell
}

CustomTableCell:

import UIKit

class TextPostTableViewCell: UITableViewCell {

    var aNavigationController: UINavigationController!

    //MARK: Actions
    @IBAction func profilePicButtonTapped() { //We want to present a users profile

        let sb = UIStoryboard(name: "SuccessfulLogin", bundle: nil)
        let cc = (sb.instantiateViewController(withIdentifier: "otherUserViewController")) as!  OtherUserAccountViewController
        self.aNavigationController.pushViewController(cc, animated: true)
    }

    func setupCell(navigationController: UINavigationController) -> Void {

        aNavigationController = navigationController
    }
}

提前谢谢!

2 个答案:

答案 0 :(得分:1)

不,这不是最佳做法。您可以在IBAction的界面构建器中设置UIButton,或在UIViewController中将cellForRowAt添加为目标。使用任一方法,您可能需要一些识别indexPath的方法,因为您没有在tableview委托中使用didSelectRow

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

    let cell:TextPostTableViewCell = Bundle.main.loadNibNamed("TextPostTableViewCell", owner: self, options: nil)?.first as! TextPostTableViewCell
    cell.button.tag = indexPath.row // Or use some other method of identifying your data in `myAction(_:)`
    cell.button.addTarget(self, action:, @selector(myAction(_:)), for: .touchUpInside)
    ...
}

答案 1 :(得分:1)

在这种情况下你可以使用委托 这里的代码更多一些,但这是iOS开发IMO的更好方法。

class ViewController: UIViewController {

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

        let cell:TextPostTableViewCell = Bundle.main.loadNibNamed("TextPostTableViewCell", owner: self, options: nil)?.first as!     TextPostTableViewCell

        cell.delegate = self

        cell.selectionStyle = .none

        return cell
    }
}

extension ViewController: TextPostTableViewCellDelegate {
    func didTappedProfilePicButton() {
        let sb = UIStoryboard(name: "SuccessfulLogin", bundle: nil)
        let cc = (sb.instantiateViewController(withIdentifier: "otherUserViewController")) as!  OtherUserAccountViewController
        navigationController?.pushViewController(cc, animated: true)
    }
}

protocol TextPostTableViewCellDelegate: class {
    func didTappedProfilePicButton()
}

class TextPostTableViewCell: UITableViewCell {

    weak var delegate: TextPostTableViewCellDelegate?

    //MARK: Actions
    @IBAction func profilePicButtonTapped() { //We want to present a users profile
        delegate?.didTappedProfilePicButton()
    }

}