为什么在使用 navigationController.pushViewController() 时我的根视图控制器会与预期视图一起推送?

问题描述 投票:0回答:1

我有一个位于导航控制器内的 UIViewController。当我将另一个视图控制器推送到导航堆栈时,它会被推送到根视图控制器的副本顶部。该副本可以在背景中看到,并且可以与之交互和点击。这些视图是通过编程方式生成的,无需故事板或 xib。

我尝试使用 UIButton 和导航项按钮进行测试,并且发生了同样的事情。我不明白为什么它发送两个视图控制器。

这是我的主视图控制器

import UIKit

class ViewController: UIViewController {
    let tableView = UITableView()
    let countries = ["US", "UK", ...] //an array of strings
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .blue
        setupUI()
        
        tableView.delegate = self
        tableView.dataSource = self
        
    }
    
    private func setupUI() {
        view.addSubview(tableView)
        self.tableView.register(FlagCell.self, forCellReuseIdentifier: FlagCell.identifier)
        tableView.translatesAutoresizingMaskIntoConstraints = false
        
        NSLayoutConstraint.activate([
            tableView.topAnchor.constraint(equalTo: view.topAnchor),
            tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
            tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor)
        ])
    }
    
}

extension ViewController : UITableViewDelegate, UITableViewDataSource {
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return countries.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: FlagCell.identifier, for: indexPath) as! FlagCell
        let country = countries[indexPath.row]
        let image = UIImage(named: country)
        cell.flagImageView.image = image
        cell.countryNameLabel.text = country
        return cell
    }
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 80
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let vc = FlagViewController()
        let image = UIImage(named: countries[indexPath.row])
        vc.flagView.image = image
        navigationController?.pushViewController(vc, animated: true)
    }
}

这是我的详细视图控制器

import UIKit

class FlagViewController: ViewController {

    let flagView: UIImageView = {
        let flagView = UIImageView()
        return flagView
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setupUI()
    }
    
    
    // MARK: - UI Setup
    private func setupUI() {
        self.view.addSubview(flagView)
        flagView.translatesAutoresizingMaskIntoConstraints = false
        
        
        NSLayoutConstraint.activate([
            flagView.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 100),
            flagView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -100),
            flagView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor),
            flagView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor),
            
            flagView.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
            flagView.centerYAnchor.constraint(equalTo: self.view.centerYAnchor),
        ])
    }
}
swift uiviewcontroller uikit uinavigationcontroller
1个回答
0
投票

更换后问题已解决

class FlagViewController: ViewController {...}

使用下面的代码,阻止我的详细视图控制器符合我的主视图控制器类。

class FlagViewController: UIViewController {...}
© www.soinside.com 2019 - 2024. All rights reserved.