【问题标题】:Swift - How go to another UITableViewCell from UITableViewCell?Swift - 如何从 UITableViewCell 转到另一个 UITableViewCell?
【发布时间】:2019-11-30 16:57:55
【问题描述】:

我有一个 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
    }
}

【问题讨论】:

    标签: swift uitableview uiviewcontroller xcode10


    【解决方案1】:

    据我了解,您需要转到另一个屏幕。为什么不使用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 {
    

    然后,在那个视图控制器中,实现上述功能:

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

    注意:

    您需要在界面生成器中设置故事板标识符。

    【讨论】:

    • 我实施了您指示的更改,但出现了一些错误。你能帮帮我吗?
    • 当然——你不能只说类名。我会更新答案
    • 立即尝试
    • 请看我在问题中所做的更改,我放了更多代码以便您更好地理解我的问题
    • 在 viewDidLoad 中注册单元格 - 但您需要使用标志来显示其他单元格。在 FirstViewController 类下面添加 var shouldAddSecondCell :Bool = false。在 goToSecondScreen 中,添加 self.shouldAddSecondCell = true 和 self.tableView.reloadData()。在 numberOfCells 中,设置 return shouldAddSecondCell ? 2 : 1
    猜你喜欢
    • 1970-01-01
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    相关资源
    最近更新 更多