Swift3、CloudKit 和 UITableView 返回空白表
Posted
技术标签:
【中文标题】Swift3、CloudKit 和 UITableView 返回空白表【英文标题】:Swift3, CloudKit and UITableView returns blank table 【发布时间】:2017-02-22 09:57:54 【问题描述】:我有一个小的心理障碍,我对 Core Data 很满意,并决定为我的一些应用程序深入研究 CloudKit,但是虽然上传方面相当基本,但我在填充一个简单的表格时遇到了麻烦查看。
CKRecord 是 Activity,我想显示的字段是名称。打印函数 print(actName) 返回 7 次,显示所有记录都已统计,但表格为空白且没有错误。
我确信这很简单,我只见树木不见森林,所以我很高兴能指出正确的方向。
干杯
import UIKit
import CloudKit
class TableViewController: UITableViewController
var activities = [Activity]()
override func viewDidLoad()
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
override func numberOfSections(in tableView: UITableView) -> Int
return 1
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
print("counted records")
return activities.count
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
let active = activities[indexPath.row]
if let actName = active.name
cell.textLabel?.text = actName
print(actName)
return cell
【问题讨论】:
activities
数组中存储对象的位置。
尼拉夫,这是我的意图。我的 CK 记录类型是公共数据库中的活动。我不知道为什么我会返回“计数记录”而不是“actName”。
正如我所说,这是我第一次深入 CloudKit,并且我使用了一些用于我的 CoreData 应用程序的语法,这些应用程序可以完美运行。
在activities
数组中存储对象后是否重新加载tableView。您需要向我们展示您在活动数组中添加对象的代码。
嗨 Nirav,我有点迷失了。我假设,指定 CKRecord Activity,然后使用 Activity (name) 中的字段,我可以在表格行中显示名称。这就是我在 Core Data 中处理它的方式,不同之处在于指定持久容器 - let context = (UIApplication.shared.delegate as!AppDelegate).persistentContainer.viewContext 我想我缺少的是对容器的引用?这是对公共数据库的引用吗?
【参考方案1】:
我似乎已经解决了,user3069232,我不认为有/没有很大的延迟问题,因为更新代码是使用 CloudKit 桌面即时的。 Nirav,我认为您是对的,归结为不存储然后重新加载。我已经修改了我的原始代码,因为我认为“活动”也引起了问题,下面的脚本运行良好,感谢大家指出正确的方向。
import UIKit
import CloudKit
class CoursesVC: UIViewController, UITableViewDelegate, UITableViewDataSource
@IBOutlet weak var coursesTable: UITableView!
var coursesArray: Array<CKRecord> = []
var selectedCourseIndex: Int!
override func viewDidLoad()
super.viewDidLoad()
coursesTable.delegate = self
coursesTable.dataSource = self
fetchCourses()
func numberOfSections(in tableView: UITableView) -> Int
return 1
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return coursesArray.count
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "courseCell", for: indexPath)
let courseRecord: CKRecord = coursesArray[indexPath.row]
cell.textLabel?.text = courseRecord.value(forKey: "courseVenue") as? String
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "dd MMMM yyyy"
let CSDate = dateFormatter.string(from: courseRecord.value(forKey: "courseDate") as! Date)
// let CSDetail = courseRecord.value(forKey: "courseDetail") as? String
cell.detailTextLabel?.text = CSDate
return cell
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat
return 40.0
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
selectedCourseIndex = indexPath.row
performSegue(withIdentifier: "showMapDetail", sender: self)
func fetchCourses()
let container = CKContainer.default()
let publicDatabase = container.publicCloudDatabase
let predicate = NSPredicate(format: "TRUEPREDICATE")
let query = CKQuery(recordType: "Courses", predicate: predicate)
query.sortDescriptors = [NSSortDescriptor(key: "courseDate", ascending: true)]
publicDatabase.perform(query, inZoneWith: nil) (results, error) -> Void in
if error != nil
print("error fetch notes \(error)")
else
print("Success")
for result in results!
self.coursesArray.append(result )
OperationQueue.main.addOperation( () -> Void in
self.coursesTable.reloadData()
self.coursesTable.isHidden = false
)
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
【讨论】:
以上是关于Swift3、CloudKit 和 UITableView 返回空白表的主要内容,如果未能解决你的问题,请参考以下文章
Swift 3 使用 CKAsset 将图像发送到 CloudKit
Swift 3.0 CloudKit fetchDatabaseChangesCompletionBlock 错误
如何在 swift 3 中为 UITable 视图提供单元格缩进级别?