cellForRowAt не работает в childTableView - PullRequest
0 голосов
/ 06 января 2020

Я - быстрый разработчик начального уровня и работаю в личном приложении, но у меня возникла проблема с моим "tableViewController".

У меня есть первое табличное представление, где я получаю некоторые события из API и затем я пытаюсь показать «detailViewController» всякий раз, когда я выбираю событие. До сих пор все кажется идеальным, но моя проблема в том, что у моего "detailsviewcontroller" есть изображение для события, заголовок ... и затем встроенный "табличный вид", чтобы показать детали. На этом этапе функция numberOfRowsInSection работает, но cellForRowAt никогда не вызывался для заполнения интегрированного табличного представления. Любая помощь, пожалуйста? Я надеюсь, что я разъясняю в своем объяснении

Это код "childtableview", в котором я хочу показать детали события (я использую символы массива просто для того, чтобы попробовать:

import UIKit
import SwiftyJSON

class ChildDetailsViewController: UIViewController, UITableViewDelegate {
    var event: JSON?
    let detailsTableView = UITableView()
    var characters = ["test1", "test2", "test3", "test4"]
    override func loadView() {
        print("details")
       super.loadView()
       view.addSubview(detailsTableView)
       detailsTableView.translatesAutoresizingMaskIntoConstraints = false
       detailsTableView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
       detailsTableView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
       detailsTableView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
       detailsTableView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
       detailsTableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
       detailsTableView.dataSource = self
       detailsTableView.delegate = self
       detailsTableView.reloadData()
    }
}

extension ChildDetailsViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        //this insctruction does print 4 
        print(characters.count)
        //but it doesn't return 4 cells in the tableview
        return characters.count
  }

  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
    print(characters[indexPath.row])
    cell.textLabel?.text = characters[indexPath.row]
    return cell
  }
}

и вот код detailsViewController, который содержит изображение и заголовок, а также дочерний просмотр таблицы:

import UIKit
import  SwiftyJSON

class EventDetailsViewController: UIViewController {
    var event : JSON?

    @IBOutlet weak var segmentedController: UISegmentedControl!
    @IBOutlet weak var ticketsView: UIView!
    @IBOutlet weak var locationView: UIView!
    @IBOutlet weak var detailsView: UIView!
    @IBOutlet weak var eventImage: UIImageView!
    @IBOutlet weak var eventTitle: UILabel!
    let newView = UIView()
    let childDetails = ChildDetailsViewController()
    var views : [UIView]!

    override func viewDidLoad() {
        filltheImageAndTile()
        // add new view to the main view
        super.viewDidLoad()
        view.addSubview(newView)

        //locate it under the event image and the segnented controller
        newView.translatesAutoresizingMaskIntoConstraints = false
        newView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        newView.topAnchor.constraint(equalTo: segmentedController.bottomAnchor, constant: 25).isActive = true
        newView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
        newView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true

        views = [UIView]()
        views.append(ChildDetailsViewController().view)
        views.append(ChildLocationViewController().view)

        for itemView in views {
            newView.addSubview(itemView)
        }
        newView.bringSubviewToFront(ChildDetailsViewController().view)
    }

    @IBAction func segmentedControlOptionChanged(_ sender: UISegmentedControl) {
        newView.bringSubviewToFront(views[sender.selectedSegmentIndex])
    }

    @IBAction func backButtonClicked(_ sender: UIBarButtonItem) {
        self.navigationController?.dismiss(animated: true)
    }
}

Ответы [ 2 ]

0 голосов
/ 06 января 2020

Проблема в том, что вы создаете экземпляр ChildDetailsViewController и добавляете его представление в массив views, но экземпляр ChildDetailsViewController никогда нигде не сохраняется и никогда не добавляется в родительский контроллер представления. и newView.bringSubviewToFront(ChildDetailsViewController().view) эта строка ничего не сделает, потому что вы создаете новый экземпляр и переносите его представление на передний план, но оно никогда не добавлялось нигде в суперпросмотре

views = [UIView]()
views.append(ChildDetailsViewController().view)//this shouldn't be like this
views.append(ChildLocationViewController().view)

for itemView in views {
    newView.addSubview(itemView)
}
newView.bringSubviewToFront(ChildDetailsViewController().view)//this shouldn't be like this

Вы уже создали экземпляр childDetails вы должны использовать его, как показано ниже

childDetails.willMove(toParent: self)
self.addChild(childDetails)

let locationViewController = ChildLocationViewController()
locationViewController.willMove(toParent: self)
self.addChild(locationViewController)

views = [UIView]()
views.append(childDetails.view)
views.append(locationViewController.view)

for itemView in views {
    newView.addSubview(itemView)
}
childDetails.didMove(toParent: self)
locationViewController.didMove(toParent: self)
newView.bringSubviewToFront(childDetails.view)
0 голосов
/ 06 января 2020

1 - Это

views.append(ChildDetailsViewController().view)
views.append(ChildLocationViewController().view)

- неправильный способ добавления содержащейся проверки vcs Добавление контроллера представления как подпредставления в другом контроллере представления

2 - Вам нужно задать ограничение высоты / дна newView

...