我有一个位于导航控制器内的 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),
])
}
}
更换后问题已解决
class FlagViewController: ViewController {...}
使用下面的代码,阻止我的详细视图控制器符合我的主视图控制器类。
class FlagViewController: UIViewController {...}