- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的程序构建如下:
我有一个 UIViewController
SingleEventViewController 来布局和处理事件的数据。它的元素之一是 UIView
TeilnehmerTableView,其中包含 UITableView
participantsTableView。
顾名思义,它是用来展示参与事件的用户的。首先,我在没有“真实”数据的情况下实现了它。我对用户数组进行了硬编码,并基于它构建了 TableView 。这非常有效。
但是由于我实现了 fetchUsers 方法并用该信息填充了数组,所以 tableView
根本没有出现。显然,当我第一次加载页面时,它不会显示任何内容,因为 numberOfRowsInSection
返回 0。但即使在获取之后,当我重新加载 tableview 时,numberOfRowsInSection
返回一个值, TableView 为空。在调试时,我注意到填充单元格的方法 cellForRowAt
永远不会被调用。我不知道发生了什么,因为在使用真实数据之前一切都有效。
谁能告诉我发生了什么事吗?
import UIKit
import Firebase
class TeilnehmerTableView: UIView, UITableViewDelegate, UITableViewDataSource {
var parentVC: SingleEventViewController?
var users = [User]()
let participantsTableView: UITableView = {
let ctv = UITableView()
return ctv
}()
override init(frame: CGRect) {
super.init(frame: frame)
self.backgroundColor = UIColor.green
setupTableView()
setupViews()
confBounds()
fetchUsers()
}
func setupTableView() {
participantsTableView.delegate = self
participantsTableView.dataSource = self
participantsTableView.register(TeilnehmerTVCell.self, forCellReuseIdentifier: TeilnehmerTVCell.reuseIdentifier)
participantsTableView.tintColor = .white
}
func setupViews() {
addSubview(participantsTableView)
}
func confBounds(){
participantsTableView.anchor(top: topAnchor, left: leftAnchor, bottom: bottomAnchor, right: rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: 0)
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
print("Users: ",users.count)
return users.count
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
print("heightForRowAt Called")
return 44
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
print("cellForRowAt Called")
let row = tableView.dequeueReusableCell(withIdentifier: TeilnehmerTVCell.reuseIdentifier, for: indexPath) as! TeilnehmerTVCell
row.user = users[indexPath.item]
return row
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: false)
}
//MARK: - Methods
func fetchUsers() {
print("Fetching users..")
let ref = Database.database().reference().child("users")
ref.observeSingleEvent(of: .value, with: { (snapshot) in
guard let dictionaries = snapshot.value as? [String: Any] else { return }
dictionaries.forEach({ (key, value) in
if key == Auth.auth().currentUser?.uid {
print("Found myself, omit from list")
return
}
guard let userDictionary = value as? [String: Any] else { return }
let user = User(uid: key, dictionary: userDictionary)
self.users.append(user)
})
self.users.sort(by: { (u1, u2) -> Bool in
return u1.username.compare(u2.username) == .orderedAscending
})
DispatchQueue.main.async( execute: {
self.participantsTableView.reloadData()
})
}) { (err) in
print("Failed to fetch users for search:", err)
}
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
这是父级SingleEventVC的代码:
import UIKit
import MapKit
class SingleEventViewController: UIViewController {
var thisEvent: Event
var eventName: String?
var eventDescription: String?
var eventLocation: CLLocationCoordinate2D?
var eventStartingDate: Date?
var eventFinishingDate: Date?
var eventNeedsApplication: Bool?
let padding: CGFloat = 20
//MARK: - GUI Objects
let scrollView: UIScrollView = {
let view = UIScrollView()
return view
}()
let teilnehmerLabel: UILabel = {
let label = UILabel()
label.font = UIFont.systemFont(ofSize: 20)
label.text = "Teilnehmer"
label.textColor = .black
return label
}()
let teilnehmerTV: TeilnehmerTableView = {
let tvt = TeilnehmerTableView()
tvt.backgroundColor = .brown
return tvt
}()
let buttonDividerView: UIView = {
let tdv = UIView()
tdv.backgroundColor = UIColor.gray
return tdv
}()
let participateButton: UIButton = {
let button = UIButton()
button.backgroundColor = CalendarSettings.Colors.buttonBG
button.setTitle("Teilnehmen", for: .normal)
button.setTitleColor(CalendarSettings.Colors.darkRed, for: .normal)
return button
}()
init(event: Event) {
thisEvent = event
super.init(nibName: nil, bundle: nil)
setupDefaultValues()
}
override func viewDidLoad() {
super.viewDidLoad()
applyDefaultValues()
setupNavBar()
setupViews()
confBounds()
getSnapshotForLocation()
}
//MARK: - Setup
func setupDefaultValues() {
eventName = thisEvent.eventName
eventDescription = thisEvent.eventDescription
eventLocation = thisEvent.eventLocation
eventStartingDate = thisEvent.eventStartingDate
eventFinishingDate = thisEvent.eventFinishingDate
eventNeedsApplication = thisEvent.eventNeedsApplication
}
func applyDefaultValues() {
titleLabel.text = eventName
descLabel.text = eventDescription
if let start = eventStartingDate, let finish = eventFinishingDate {
timeLabel.text = "Von \(start.getHourAndMinuteAsStringFromDate()) bis \(finish.getHourAndMinuteAsStringFromDate())"
}
if let location = eventLocation {
locationLabel.text = getStringFromLocation(location: location)
mapLabel.text = getStringFromLocation(location: location)
}
if let date = eventStartingDate {
dateLabel.text = formatDate(date: date)
}
}
func setupNavBar() {
self.navigationItem.title = "Event"
}
func setupViews() {
view.addSubview(scrollView)
view.addSubview(participateButton)
participateButton.addTarget(self, action: #selector (buttonClick), for: .touchUpInside)
view.addSubview(buttonDividerView)
scrollView.addSubview(teilnehmerLabel)
scrollView.addSubview(teilnehmerTV)
teilnehmerTV.parentVC = self
}
func confBounds(){
let tabbarHeight = self.tabBarController?.tabBar.frame.height ?? 0
let tableviewHeight: CGFloat = CGFloat(teilnehmerTV.users.count) * 44
participateButton.anchor(top: nil, left: view.leftAnchor, bottom: view.bottomAnchor, right: view.rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: tabbarHeight, paddingRight: 0, width: 0, height: 50)
buttonDividerView.anchor(top: nil, left: view.leftAnchor, bottom: participateButton.topAnchor, right: view.rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: 0.5)
scrollView.anchor(top: view.topAnchor, left: view.leftAnchor, bottom: buttonDividerView.topAnchor, right: view.rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: 0)
teilnehmerLabel.anchor(top: descLabel.bottomAnchor, left: view.leftAnchor, bottom: nil, right: view.rightAnchor, paddingTop: 20, paddingLeft: padding, paddingBottom: 0, paddingRight: padding, width: 0, height: 0)
teilnehmerTV.anchor(top: teilnehmerLabel.bottomAnchor, left: view.leftAnchor, bottom: scrollView.bottomAnchor, right: view.rightAnchor, paddingTop: 5, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: tableviewHeight)
}
override func viewDidLayoutSubviews() {
let objHeight = titleLabel.frame.height + locationLabel.frame.height + dateLabel.frame.height + timeLabel.frame.height + mapView.frame.height + notizenLabel.frame.height + descLabel.frame.height + teilnehmerLabel.frame.height + teilnehmerTV.frame.height
let paddingHeight = 10+0+50+padding+20+5 - 15
print(objHeight, paddingHeight)
scrollView.contentSize = CGSize(width: view.frame.width, height: objHeight+paddingHeight)
}
//MARK: - Methods
@objc func buttonClick() {
teilnehmerTV.participantsTableView.reloadData()
print(teilnehmerTV.participantsTableView.numberOfRows(inSection: 0))
scrollView.reloadInputViews()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
最佳答案
这是因为您在发出提取请求时尚未将 TeilnehmerTableView
添加到 SingleEventViewController
中的 View - 您在 TeilnehmerTableView
初始化期间发出请求>。尝试在将 TeilnehmerTableView
添加到 View 后从 SingleEventViewController
调用 fetchUsers
;然后它应该可以工作。
关于ios - Tableviews "cellForRowAt"在添加真实数据后永远不会被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52314227/
当我尝试运行代码时,cellForRowAtIndexPath 函数由于某种原因无法运行。 numberOfSections 函数运行良好。我认为这是 dataSource/delegate 函数或单
我对使用 cellForRowAt 执行代码的顺序有疑问 这是我的 cellForRowAt 函数 func tableView(_ tableView: UITableView, cellForRo
我需要检测 UITableViewController 中的按钮是否被点击 override func tableView(_ tableView: UITableView, cellForRowAt
我创建了两个类 NumberTableViewCell 和 YesNoTableViewCell,它们的类型均为 UITableViewCell。它们“附加”了动态原型(prototype)(如果我说
我的程序构建如下: 我有一个 UIViewController SingleEventViewController 来布局和处理事件的数据。它的元素之一是 UIView TeilnehmerTable
根据下面的代码,我第一次运行应用程序。前 3 行工作正常。但是当我上下滚动时。一些线路也会改变。当我做更多的上下它更改为其他行 我该如何解决这个问题 func tableView(_ tabl
我在 UITableViewController 中创建 TableView 时遇到问题。行数返回非零数,高度在 Storyboard 中设置。但是 cellForRowAt永远不会被调用。 这是代码
这个问题让我疯狂了 3 天。我创建了一个自定义单元类: class TransitoPalinaTableViewCell: UITableViewCell { @IBOutlet weak var
我认为我很接近,但似乎让自己感到困惑,因为我可以访问所有数据,但无法使其正常运行。 我正在尝试在表格 View 的表格中显示其各自公司(部门)下的员工列表。 我的 CoreData 在存储值和关系方面
你能帮我找到一个解决方案,而不是一次又一次地复制相同的代码吗?现在我有了这段代码 func tableView(_ tableView: UITableView, cellForRowAt i
我在使 cellForRowAt 工作时遇到问题,但不幸的是我的应用程序在编译后仍然是空白的。我正在使用 Xcode 8.3 beta 3。 import UIKit class myCell: UI
我是 swift 和 UITableView 的新手,我正在从请求中获取数据,并试图在表格 View 上显示结果。我得到的数据很好,但我的表格 View 不滚动。我知道这个问题有很多问题,但我看到其他
我试图在按下 UITabelViewCell 时获得不同的标签文本,但我无法让它工作。 completed 的默认值为 false,触摸时应为 true,然后应更改标签。在 didSelectRowA
这个问题在这里已经有了答案: How to get the indexpath.row when an element is activated? (20 个答案) 关闭 5 年前。 我想访问 ce
我有一个 ChatViewController 和聊天消息。我使用 Storyboard 约束和标识符初始化消息气泡的布局,以通过代码更改它们: func tableView(_ tableView:
我需要将表格滚动到底部。当我在 viewwilAppear 中编写滚动表格的代码时,它不起作用,但是当我在 viewDidAppear 中编写相同的代码时,它可以工作,但用户会看到滚动。我不想看到用户
我有一个问题,numberOfRowsInSection 和 cellForRowAt 函数不返回值。我需要将名称和价格从 coincap.io/front API 返回到 tableView 中。我
我正在尝试拥有 UITableView (主要)其中包含另一个 UITableView (次要)在每个单元格中。主要和次要 TableView 都有自己的数据源对象类,MajorDatasource
我是一名入门级 swift 开发人员,我正在个人应用程序中工作,但我的“tableViewController”遇到了问题。 我有一个第一个表格 View ,我从 API 中获取一些事件,然后我想做的
我有一个显示购物 list 名称的 TableView Controller 。这些购物 list 是通过购物 list 类创建的,它让我可以指定购物 list 的名称和其中的项目。此 TableVi
我是一名优秀的程序员,十分优秀!