Ios Swift:将TableView节与对象数组一起使用(错误:类型的值没有下标//类型的值没有成员“count”)
我遇到了一个无法找到解决方案的问题,搜索网页也帮不了我 问题很简单。我知道如何使用TableView,也知道如何使用Ios Swift:将TableView节与对象数组一起使用(错误:类型的值没有下标//类型的值没有成员“count”),ios,arrays,swift,firebase,uitableview,Ios,Arrays,Swift,Firebase,Uitableview,我遇到了一个无法找到解决方案的问题,搜索网页也帮不了我 问题很简单。我知道如何使用TableView,也知道如何使用numberOfSections功能 现在的问题是,我正在以对象数组的形式从Firebase数据库检索数据。 这里是members=[PaymentTeam](),类的外观如下: class PaymentTeam { var key: String? let memberJob: String? let memberName: String?
numberOfSections
功能
现在的问题是,我正在以对象数组的形式从Firebase数据库检索数据。
这里是members=[PaymentTeam]()
,类的外观如下:
class PaymentTeam {
var key: String?
let memberJob: String?
let memberName: String?
let memberID:String?
let projectCreated:String?
let projectName: String?
let confirmedBool: Bool?
let paidBool: Bool?
init(memberJob: String, memberName: String, memberID:String, confirmedBool: Bool, paidBool: Bool, projectCreated:String, projectName: String) {
self.memberName = memberName
self.memberJob = memberJob
self.memberID = memberID
self.projectCreated = projectCreated
self.confirmedBool = confirmedBool
self.paidBool = paidBool
self.projectName = projectName
}
var dictValue: [String: Any] {
return ["memberName" : memberName as Any,
"memberJob" : memberJob as Any,
"memberID": memberID as Any,
"projectCreated": projectCreated as Any,
"confirmedBool": confirmedBool as Any,
"paidBool": paidBool as Any,
"projectName": projectName as Any
]
}
init?(snapshot: DataSnapshot) {
guard let dict = snapshot.value as? NSDictionary,
let memberJob = dict["memberJob"] as? String,
let memberName = dict["memberName"] as? String,
let projectCreated = dict["projectCreated"] as? String,
let projectName = dict["projectName"] as? String,
let memberID = dict["memberID"] as? String,
let confirmedBool = dict["confirmedBool"] as? Bool,
let paidBool = dict["paidBool"] as? Bool
else {return nil}
self.memberJob = memberJob
self.memberName = memberName
self.projectCreated = projectCreated
self.projectName = projectName
self.memberID = memberID
self.confirmedBool = confirmedBool
self.paidBool = paidBool
}
}
static func chosenTeam(for user: User, completion: @escaping ([PaymentTeam]) -> Void) {
let ref = Database.database().reference().child("selectedTeams").child(User.current.uid)
ref.observe(DataEventType.value, with: { (snapshot) in
guard let snapshot = snapshot.children.allObjects as? [DataSnapshot] else {
return completion([])
}
let chosenTeam = snapshot.reversed().compactMap(PaymentTeam.init)
completion(chosenTeam)
})
}
检索过程如下所示:
class PaymentTeam {
var key: String?
let memberJob: String?
let memberName: String?
let memberID:String?
let projectCreated:String?
let projectName: String?
let confirmedBool: Bool?
let paidBool: Bool?
init(memberJob: String, memberName: String, memberID:String, confirmedBool: Bool, paidBool: Bool, projectCreated:String, projectName: String) {
self.memberName = memberName
self.memberJob = memberJob
self.memberID = memberID
self.projectCreated = projectCreated
self.confirmedBool = confirmedBool
self.paidBool = paidBool
self.projectName = projectName
}
var dictValue: [String: Any] {
return ["memberName" : memberName as Any,
"memberJob" : memberJob as Any,
"memberID": memberID as Any,
"projectCreated": projectCreated as Any,
"confirmedBool": confirmedBool as Any,
"paidBool": paidBool as Any,
"projectName": projectName as Any
]
}
init?(snapshot: DataSnapshot) {
guard let dict = snapshot.value as? NSDictionary,
let memberJob = dict["memberJob"] as? String,
let memberName = dict["memberName"] as? String,
let projectCreated = dict["projectCreated"] as? String,
let projectName = dict["projectName"] as? String,
let memberID = dict["memberID"] as? String,
let confirmedBool = dict["confirmedBool"] as? Bool,
let paidBool = dict["paidBool"] as? Bool
else {return nil}
self.memberJob = memberJob
self.memberName = memberName
self.projectCreated = projectCreated
self.projectName = projectName
self.memberID = memberID
self.confirmedBool = confirmedBool
self.paidBool = paidBool
}
}
static func chosenTeam(for user: User, completion: @escaping ([PaymentTeam]) -> Void) {
let ref = Database.database().reference().child("selectedTeams").child(User.current.uid)
ref.observe(DataEventType.value, with: { (snapshot) in
guard let snapshot = snapshot.children.allObjects as? [DataSnapshot] else {
return completion([])
}
let chosenTeam = snapshot.reversed().compactMap(PaymentTeam.init)
completion(chosenTeam)
})
}
现在的问题是:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return members[section].count
}
我收到错误消息:类型为“PaymentTeam”的值没有成员“计数”
,我只能在不同的类成员之间进行选择,如成员。memberID
对于功能:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let member = members[indexPath.section][indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: "ChosenTeamNameTableViewCell") as! ChosenTeamNameTableViewCell
cell.memberNameLabel.text = member.memberName
return cell
}
我收到以下错误消息:
Value of type 'PaymentTeam' has no subscripts
其中,[indexPath.section]
带下划线
也许有人能帮我弄清楚如何在成员
数组中构造Firebase数据,以便实际使用numberofSections
以下是带有Tableview的ViewController的全部代码:
class PaymentHomeViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var headerSeperator: UIView!
var members = [PaymentTeam]()
override func viewDidLoad() {
super.viewDidLoad()
setUpUI()
UserService.chosenTeam(for: User.current) { (chosenTeam) in
self.members = chosenTeam
for value in self.members {
self.projectTitles.append(value.projectName ?? "Error")
}
self.tableView.reloadData()
}
}
func setUpUI() {
Utilities.addShadowtoView(headerSeperator)
}
extension PaymentHomeViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let label = UILabel()
label.text = "Header"
label.backgroundColor = UIColor.lightGray
}
func numberOfSections(in tableView: UITableView) -> Int {
return members.count
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return members[section].count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let member = members[indexPath.section][indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: "ChosenTeamNameTableViewCell") as! ChosenTeamNameTableViewCell
cell.memberNameLabel.text = member.memberName
return cell
}
}
// MARK: - UITableViewDelegate
extension PaymentHomeViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return 78
}
}
提前感谢您的帮助。:) 在
numberOfRowsInSection
中,您无意中试图在此处访问名为“count”的“PaymentTeam”类型的成员:
“members”是一维数组,因此,members[section]
返回类型为PaymentTeam
的对象,该对象不是数组,因此不会有计数。将其更改为:
return members.count
现在,第二个错误出现在这一行:
let member = members[indexPath.section][indexPath.row]
同样,“成员”是一维数组,而不是二维数组。您正试图使用array[index1][index2]
访问二维数组的成员。这没有意义,因为PaymentTeam
不是数组。您可以在StackOverflow线程中找到有关swift中二维数组的更多信息。将此更改为:
let member = members[indexPath.row]