0
我正在尝试从Firestore数据库中填充段控制tableview,但是由于某种原因而无法这样做,我正在尝试一个在线示例,该示例具有预设数据,但是在这里我正在从Firestore数据库中检索数据。
它也不会给出任何运行时错误,只是不加载数据。下面是viewcontroller的屏幕截图作为代码。 class FirstSegementViewController: UIViewController {
@IBOutlet var segmentControl:UISegmentedControl!
@IBOutlet var tableView: UITableView!
var s1Post:[s1] = []
var s2Post:[s2] = []
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
retrieveAllPosts()
}
func retrieveAllPosts(){
let postsRef = Firestore.firestore().collection("posts").limit(to: 50)
postsRef.getDocuments { (snapshot, error) in
if let error = error {
print(error.localizedDescription)
} else {
if let snapshot = snapshot {
for document in snapshot.documents {
let data = document.data()
//self.postKey = document.documentID
let username = data["post_author_username"] as? String ?? ""
let postTitle = data["postTitle"] as? String ?? ""
let postcategory = data["postcategory"] as? String ?? ""
let postContent = data["postContent"] as? String ?? ""
let postAuthorProfilePicUrl = data["post_user_profile_pic_url"] as? String ?? ""
let postAuthorSpinnerC = data["post_author_spinnerC"] as? String
let newSourse = s1(_documentId: document.documentID, _username: username, _postTitle: postTitle, _postcategory: postcategory, _postContent: postContent, _postuserprofileImagUrl: postAuthorProfilePicUrl, _postAuthorSpinncerC: postAuthorSpinnerC)
self.s1Post.append(newSourse)
// print(self.postKey)
}
self.tableView.reloadData()
}
}
}
}
@IBAction func indexChanged(_ sender: UISegmentedControl) {
switch segmentControl.selectedSegmentIndex
{
case 0:
retrieveAllPosts()
// label1.text = "First Segment Selected"
case 1:
retrieveAllPosts()
// label1.text = "Second Segment Selected"
default:
break
}
//self.tableView.reloadData()
}
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destination.
// Pass the selected object to the new view controller.
}
*/
/*
// MARK: - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destination.
// Pass the selected object to the new view controller.
}
*/
}
extension FirstSegementViewController: UITableViewDelegate, UITableViewDataSource{
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
var value = 0
switch segmentControl.selectedSegmentIndex{
case 0:
value = s1Post.count
break
case 1:
value = s2Post.count
break
default:
break
}
return value
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath) as! MyWsPostCell
switch segmentControl.selectedSegmentIndex{
case 0:
cell.s11 = s1Post[indexPath.row]
break
case 1:
cell.s21 = s2Post[indexPath.row]
break
default:
break
}
return cell
}
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
从您提供的代码片段来看,您正在尝试从Firebase Firestore数据库中获取数据并填充一个分段控制的TableView。您的代码逻辑似乎是正确的,但有几个可能的问题点和建议,可以帮助您排查问题:
确保数据库连接正常:请确认您的应用已正确配置Firestore,并且具有访问数据库的权限。检查GoogleService-Info.plist
文件是否已添加到项目中,并且在Firebase Console中启用了Firestore数据库。
错误处理和日志打印:虽然您已经添加了错误处理来捕获查询中的错误,但可以增加一些日志打印来帮助调试。例如,在成功获取数据后打印一下s1Post.count
的值,确认数据确实被加载了。
TableView Delegate和DataSource设置:确保您的ViewController是TableView的代理和数据源,并且这些委托方法已被TableView正确引用。通常在viewDidLoad()
中设置:
tableView.delegate = self
tableView.dataSource = self
分段索引切换时的数据刷新:您在indexChanged
方法中调用了retrieveAllPosts()
,这会重新获取数据,但是没有显式地调用tableView.reloadData()
。尽管在retrieveAllPosts()
内部有reloadData的调用,但在某些情况下,明确地在indexChanged
里调用可能会更清晰和保险。
数据模型初始化:确认s1
和s2
两个结构体或类定义正确,特别是属性名称与Firestore字段名匹配无误,且遵循Swift的可选性和非可选性规则。
TableViewCell重用标识符:确保Storyboard中的TableViewCell的重用标识符"MyCell"与代码中使用的完全一致。
TableView的分段逻辑:看起来您只实现了从Firestore获取s1Post
数据的逻辑,而s2Post
数组似乎没有对应的获取数据方法。如果s2Post
也需要从Firestore获取不同的数据集,请确保为它实现相应的数据检索逻辑。
运行时检查:使用Xcode的Debug工具,如断点、查看变量值等,特别是在retrieveAllPosts()
方法内,以确定数据是否被正确读取和存储到了数组中。
如果以上步骤都检查过还是无法解决问题,可能需要进一步检查是否有其他隐藏的逻辑错误或者环境配置问题。