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

iOS Swift:从自定义Tableview单元格中将视图推送到堆栈上,ios,iphone,uitableview,swift3,Ios,Iphone,Uitableview,Swift3,我在VC中有一个tableview,它有一个导航控制器,它包含自定义的表格单元格。我想知道,如果点击自定义表格单元格中的按钮,那么将其推到父VC的导航堆栈上的最佳实践是什么。如果我将父VC的导航控制器传递给单元格,我就能够让它工作;但这是最有效的做法吗?请参见下面我的当前实施: UserAccountVC: func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCe

我在VC中有一个tableview,它有一个导航控制器,它包含自定义的表格单元格。我想知道,如果点击自定义表格单元格中的按钮,那么将其推到父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
}
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
    }
}
CustomTableCell:

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
}
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
    }
}

提前谢谢你

不,这不是最佳做法。您可以在界面生成器中为您的
ui按钮设置
iAction
,或将您的
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)
    ...
}

不,这不是最佳做法。您可以在界面生成器中为您的
ui按钮设置
iAction
,或将您的
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)
    ...
}

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

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()
    }

}

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

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()
    }

}