Swift - 如何从 UITableViewCell 转到另一个 UITableViewCell?

标签 swift uitableview uiviewcontroller xcode10

我有一个 UIViewController,它根据屏幕上的所需选项实例化一些 UITableViewCell。这些选项之一是“说明”,我创建了一个 .XIB 文件来在屏幕上显示说明。但是,在此屏幕上,我有一个按钮可以显示更多说明(在另一个屏幕上)。因此,我使用说明创建了另一个 .XIB 文件,我需要从第一个说明屏幕转到那里。我该怎么做?

这是我的代码:

import UIKit

class FirstInstructionsCell: UITableViewCell {

    @IBOutlet weak var showSecondInstructions: UIButton!

    var secondInstructionsView: SecondInstructions!

    static let FIRST_INSTRUCTIONS_CELL_IDENTIFIER = "FirstInstructionsCell"

    @IBAction func showSecondInstructionsTapped(_ sender: UIButton) {
        print("Here I need to go to SecondInstructions screen")
    }
}

更改后,我的 UIViewController:

import UIKit

class FirstInstructionsViewController: UIViewController, FirstInstructionsCellDelegate {
    func goSecondScreen() {
        presentViewController(SecondInstructions, animated: true, completion: nil) 
// Here I have an error: Cannot convert value of type 'SecondInstructions.Type' to expected argument type 'UIViewController'
// 'SecondInstructions' is a UITableViewCell
    }

    @IBOutlet weak var confirmButton: UIButton!

    @IBOutlet weak var tableView: UITableView!

    var withdrawalCode: Int!

    override func viewDidLoad() {
        super.viewDidLoad()

        self.tableView.register(UINib(nibName: FirstInstructionsCell.FIRST_INSTRUCTIONS_CELL_IDENTIFIER, bundle: nil), forCellReuseIdentifier: FirstInstructionsCell.FIRST_INSTRUCTIONS_CELL_IDENTIFIER)

        self.tableView.rowHeight = UITableView.automaticDimension
        self.tableView.estimatedRowHeight = 470.0
    }


    //MARK: - Actions

    @IBAction func onConfirmClicked(_ sender: UIButton) {
        self.navigationController?.popViewController(animated: true)
    }

}

// MARK: - UITableViewDelegate
extension FirstInstructionsViewController: UITableViewDelegate {
    func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
        return 13.0
    }

    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 142.0
    }

    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        return PayPaxxHeaderView.loadFromNib(CGRect(x: 0, y: 0, width: self.view.bounds.width, height: 142.0)) as! PayPaxxHeaderView
    }
}

// MARK: - UITableViewDataSource
extension FirstInstructionsViewController: UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = self.tableView.dequeueReusableCell(withIdentifier: FirstInstructionsCell.FIRST_INSTRUCTIONS_CELL_IDENTIFIER, for: indexPath) as! FirstInstructionsCell
        cell.fillCell(self.withdrawalCode)
        cell.delegate = self
        return cell
    }
}

最佳答案

据我了解,您需要转到另一个屏幕。为什么不为此使用 protocol

import UIKit

protocol FirstInstructionsCellDelegate {
    func goToSecondScreen()
}

class FirstInstructionsCell: UITableViewCell {

    @IBOutlet weak var showSecondInstructions: UIButton!

    var secondInstructionsView: SecondInstructions!
    var delegate : FirstInstructionsCellDelegate?

    static let FIRST_INSTRUCTIONS_CELL_IDENTIFIER = "FirstInstructionsCell"

    @IBAction func showSecondInstructionsTapped(_ sender: UIButton) {
        print("Here I need to go to SecondInstructions screen")
        delegate?.goToSecondScreen()
    }
}

然后,在您的 cellForRow(at:indexPath:) 中,您可以说(出队后):

cell.delegate = self

您的 viewController 需要实现它:

class FirstInstructionViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, FirstInstructionsCellDelegate {

然后,在该 View Controller 中,实现所述功能:

func goToSecondScreen() {
    let story = UIStoryboard(named: "SecondScreen", bundle: nil)
    let viewController = story.instantiateViewController(withIdentifier: "SecondScreen")
    self.navigationController?.pushViewController(viewController, animated: true)
    // or 
    self.present(viewController, animated: true, completion: nil)
}

注意:

您需要在界面构建器中设置 Storyboard标识符。

关于Swift - 如何从 UITableViewCell 转到另一个 UITableViewCell?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57150719/

相关文章:

ios - 为什么我的 UIButton segue 的行为不像 UITableViewCell segue?

xcode - 在 Swift 上向侧边栏菜单添加功能

ios - 单元格点击时出现“在无效索引路径处请求矩形”异常

ios - 如何在 `UIImageView` 中的自定义单元格中更改 `UITableView`

iOS 导航 Controller 基础知识和自定义后退按钮

ios - 从 nib 文件在自定义 View 中设置自定义委托(delegate)

ios - 在 Swift 中将不同的表格单元格导航到不同的 UIVewController

swift - 如何从 SKNode.children 数组访问 SKNode 子类方法?

ios - Tableview 单元格内边距和间距

ios - 未调用 UITableView didSelectRow