TableView внутри пользовательского UITableViewCell не отображается для всех ячеек этого пользовательского типа ячеек - PullRequest
0 голосов
/ 19 декабря 2018

Я пытаюсь создать таблицу служб таким образом, чтобы, если у службы было несколько подуслуг, тогда ячейка, связанная с этой службой, имела другое представление таблицы, показывающее эти подуслуги под указанной службой.

Я попытался реализовать такую ​​таблицу, посмотрев пример, показанный в ссылке: таблица внутри ячейки tableview

Я публикую соответствующие исходные коды, связанные с таблицей view

BookingServiceChargeViewCell.swift

import UIKit
import PineKit
import SwiftMoment

class BookingServiceChargeViewCell: UITableViewCell, UITableViewDelegate, UITableViewDataSource {

    var service : Service? = nil
    var subServices : [Service] = []
    let content = PineCardView()
    var cover = UIImageView()
    let serviceName = PineLabel.Bold(text: " ... ")
    var itemIndex = -1
    var chosen = false
    var parentView : OnboardingChosenServicesViewController? = nil
    var anchor = UIView()
    let table = UITableView()

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        self.selectionStyle = .none
        layout()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    func layout() {
        self.addSubview(content)
        content.snp.makeConstraints { (make) in
            make.top.left.right.equalTo(self).inset(5)
            make.bottom.equalTo(self)
        }
        layoutContent()
    }

    func layoutContent() {
        content.addSubviews([cover, serviceName])

        self.cover.image = UIImage(named: "gray-card")
        cover.clipsToBounds = true

        cover.snp.makeConstraints { (make) in
            make.width.equalTo(content).multipliedBy(0.15)
            make.left.equalTo(content).offset(10)
            make.top.equalTo(content.snp.top).offset(15)
            make.size.equalTo(50)
        }

        serviceName.textColor = UIColor.black
        serviceName.font = Config.Font.get(.Bold, size: 17.5)
        serviceName.snp.makeConstraints { (make) in
            make.centerY.equalTo(cover)
            make.left.equalTo(cover.snp.right).offset(20)
        }

        table.delegate = self
        table.dataSource = self
        table.register(BookingSubServicesChargeViewCell.self, forCellReuseIdentifier: "cell")
        table.separatorStyle = .none

        self.content.addSubview(table)
        table.snp.makeConstraints { (make) in
            make.top.equalTo(self.cover.snp.bottom).offset(15)
            make.left.equalTo(self.cover.snp.right).offset(10)
            make.right.equalTo(self.content.snp.right).offset(-10)
            make.height.equalTo(450)
        }
    }

    func configure(_ service: Service, subServices: [Service], index: Int, parentView: OnboardingChosenServicesViewController) {
        self.service = service
        self.subServices = subServices
        self.itemIndex = index
        self.parentView = parentView

        if (self.service!.defaultImage != nil){
            ImageLoader.sharedLoader.imageForUrl(urlString: self.service!.defaultImage!) { (image, url) in
                self.cover.image = image
            }
        }

        self.serviceName.text = self.service!.name!
    }

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! BookingSubServicesChargeViewCell
        cell.configure(self.subServices[indexPath.row], index: indexPath.row, parentView: self.parentView!)
        return cell
    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 80
    }
}

BookingSubServicesChargeViewCell.swift

import UIKit
import PineKit
import SwiftMoment

class BookingSubServicesChargeViewCell: UITableViewCell {

    var service : Service? = nil
    let content = PineCardView()
    var cover = UIImageView()
    let serviceName = PineLabel.Bold(text: " ... ")
    var itemIndex = -1
    var chosen = false
    var parentView : OnboardingChosenServicesViewController? = nil
    var anchor = UIView()

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        self.selectionStyle = .none
        layout()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    func layout() {
        self.addSubview(content)
        content.snp.makeConstraints { (make) in
            make.top.left.right.equalTo(self).inset(5)
            make.bottom.equalTo(self)
        }
        layoutContent()
    }

    func layoutContent() {
        content.addSubviews([cover, serviceName])

        self.cover.image = UIImage(named: "gray-card")
        cover.clipsToBounds = true

        cover.snp.makeConstraints { (make) in
            make.width.equalTo(content).multipliedBy(0.15)
            make.left.equalTo(content).offset(10)
            make.top.equalTo(content.snp.top).offset(15)
            make.size.equalTo(50)
        }

        serviceName.textColor = UIColor.black
        serviceName.font = Config.Font.get(.Bold, size: 17.5)
        serviceName.snp.makeConstraints { (make) in
            make.centerY.equalTo(cover)
            make.left.equalTo(cover.snp.right).offset(20)
        }
        self.anchor = self.serviceName
    }

    func configure(_ service: Service, index: Int, parentView: OnboardingChosenServicesViewController) {
        self.service = service
        self.itemIndex = index
        self.parentView = parentView

        if (self.service!.defaultImage != nil){
            ImageLoader.sharedLoader.imageForUrl(urlString: self.service!.defaultImage!) { (image, url) in
                self.cover.image = image
            }
        }

        self.serviceName.text = self.service!.name!
    }
}

Здесьпара скриншотов возникшей ситуации: - 1st Screenshot 2nd Screenshot 3rd Screenshot

Как вы можете видеть вна скриншотах, некоторые таблицы, которые имеют подуслуги, не показываются, но иногда они показываются.

Может кто-нибудь сказать мне, что мне здесь не хватает?Какие изменения я должен внести в исходные коды, показанные выше?

К вашему сведению: я никоим образом не использую раскадровки и не знаю, что такое nib-файлы.Я построил это программно и надеюсь, что смогу получить решение на основе фрагмента кода как можно скорее.

Спасибо.

1 Ответ

0 голосов
/ 19 декабря 2018

В BookingServiceChargeViewCell class, вызовите self.table.reloadData() в конце метода настройки, как показано ниже.

func configure(_ service: Service, subServices: [Service], index: Int, parentView: OnboardingChosenServicesViewController) {
        self.service = service
        self.subServices = subServices
        self.itemIndex = index
        self.parentView = parentView

        if (self.service!.defaultImage != nil){
            ImageLoader.sharedLoader.imageForUrl(urlString: self.service!.defaultImage!) { (image, url) in
                self.cover.image = image
            }
        }

        self.serviceName.text = self.service!.name!

        self.table.reloadData()
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...