UIView в качестве заголовка для UITableView - PullRequest
0 голосов
/ 22 марта 2020

Я изучаю iOS программирование в кратчайшие сроки по книге "iOS Программирование: Руководство по ранчо большого ботаника (6-е издание)", но это кажется немного устаревшим. Я столкнулся с проблемой при добавлении заголовка в UIViewTable в раскадровке. В книге было предложено добавить UIView поверх ячейки прототипа, разместить там кнопки с ограничениями, и это все, но в моем случае это не работает. Кнопки не отображаются :( Итак, это выглядит так: enter image description here

Не могли бы вы помочь мне с этим примером, пожалуйста?

My ItemsViewController.swift :

import UIKit

class ItemsViewController: UITableViewController {

    var itemStore: ItemStore!

    @IBAction func addNewItem(_ sender: UIButton) {

    }

    @IBAction func toggleEditingMode(_ sender: UIButton) {

        if isEditing {
            sender.setTitle("Edit", for: .normal)
            setEditing(false, animated: true)
        } else {
            sender.setTitle("Done", for: .normal)
            setEditing(true, animated: true)
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.register(UITableViewCell.self, forCellReuseIdentifier: "UITableViewCell")
    }

    override func numberOfSections(in tableView: UITableView) -> Int {

        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return itemStore.allItems.count + 1
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "UITableViewCell", for: indexPath)

        if itemStore.allItems.count == indexPath.row {

            cell.textLabel?.text = "No more items"
        } else {

            let item = itemStore.allItems[indexPath.row]
            cell.textLabel?.text = item.name
            cell.detailTextLabel?.text = "$\(item.valueInDollars)"
        }

        return cell
    }
}

UPD: Я сделал это программно через tableView(_:viewForHeaderInSection:), но это не удобно. Есть ли способ добиться того же эффекта с помощью раскадровки?

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

Я нашел root всего зла. Если вы настраиваете ItemStore следующим образом:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

    guard let _ = (scene as? UIWindowScene) else { return }

    window = UIWindow(frame: UIScreen.main.bounds)
    window?.windowScene = (scene as! UIWindowScene)
    window?.rootViewController = ItemsViewController()
    window?.makeKeyAndVisible()

    // Create an ItemStore
    let itemStore = ItemStore()

    // Access the ItemsViewController and set its item store
    let itemsController = window!.rootViewController as! ItemsViewController
    itemsController.itemStore = itemStore
}

Не делайте этого. Для меня это работает:

override func viewDidLoad() {
    super.viewDidLoad()

    itemStore = ItemStore()

    tableView.rowHeight = UITableView.automaticDimension
    tableView.estimatedRowHeight = 65
}

Книга кажется сильно устаревшей.

0 голосов
/ 22 марта 2020

Может быть связано с размером headerViewSize. Пожалуйста, попробуйте что-то вроде ниже.

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    guard let tableHeaderView = tableView.tableHeaderView else { return }
    let size = tableHeaderView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize)
    if tableHeaderView.frame.size.height != size.height {
        tableHeaderView.frame.size.height = size.height
    }
    tableView.tableHeaderView = tableHeaderView
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...