我不能在导航栏和 Table 视图之间添加 UIView 是什么原因?

Is there a reason I can't add a UIView between a Navigation Bar and a Table View?

我有一个带有导航栏和 Table 视图的视图控制器。为什么我不能使用界面生成器添加一些标签在它们之间添加另一个视图?我在 youtube 上观看了一段关于页眉和页脚委托方法的视频,但是当我使用它时,它用它让我创建的 Rect 替换了导航栏。

import UIKit
import Foundation

class ViewController: UIViewController, UITableViewDataSource,UITableViewDelegate {

    final let url = URL(string: "http://www.mildvariety.com/students")

    private var students = [Student]()
    private var selection = ""




    @IBOutlet var myTableView: UITableView!
    override func viewDidLoad() {
        super.viewDidLoad()
        myTableView.delegate = self

//        let headerView = UIView()
//        headerView.backgroundColor = UIColor.blue
//        headerView.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: 50)
//        myTableView.tableHeaderView = headerView


        self.loadJson(filename: "students")

    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        NotificationCenter.default.addObserver(forName: NSNotification.Name(rawValue: "selection"), object: nil, queue: OperationQueue.main) { (notification) in
            let popupVc = notification.object as! SortPopupViewController
            self.selection = popupVc.optionSelected
            print(self.selection)
            self.loadJson(filename: "students")
        }


    }




    func loadJson(filename fileName: String) {
        if let url = Bundle.main.url(forResource: fileName, withExtension: "json") {
            do {
                let data = try Data(contentsOf: url)
                let decoder = JSONDecoder()
                let downloadedStudents = try decoder.decode([Student].self, from: data)
//                print(jsonData[0].firstName)



                self.students = downloadedStudents

                if (self.selection == "firstName") {
                    self.students = students.sorted{[=11=].firstName < .firstName}
                }
                if (self.selection == "lastName") {
                    self.students = students.sorted{[=11=].lastName < .lastName}
                }
                if (self.selection == "year") {
                    self.students = students.sorted{[=11=].year < .year}
                }
                if (self.selection == "gpa") {
                    self.students = students.sorted{[=11=].gpa < .gpa}
                }

                DispatchQueue.main.async {
                    self.myTableView.reloadData()
                }


            } catch {
                print("error:\(error)")
            }
        }
    }

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


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "StudentCell") as? StudentCell else { return UITableViewCell() }

        cell.firstNameLabel.text = students[indexPath.row].firstName
        cell.lastNameLabel.text = students[indexPath.row].lastName
        cell.yearLabel.text = students[indexPath.row].year

        let gpaString:String = String(format:"%.1f", students[indexPath.row].gpa)

        cell.gpaLabel.text = gpaString

        return cell
    }

}

您可以在原型单元格上方添加一个视图(它变成header),并在下方添加一个视图(成为页脚)。

您已经在原型上方有一个导航栏(它是一个视图)...这就是为什么您只能在其下方添加新视图的原因。

添加导航栏作为 table header 视图是相当奇怪的。您可能希望将视图控制器嵌入到导航控制器中。