我正在做一个共有约800个JSON条目的查找类型的应用程序,我可以将其加载到内存中,因为我只是将明文解析为某些对象以充当简单模型。
但是,我不知道最好的做法是如何处理用户界面的结尾,这是事情放慢速度极大地试图滚动等等:
所以我尝试使用带编号的按钮实现分页,但是在NSCollectionView
更新时,UI仍会锁定更新并且页面会在一瞬间发生冲突。
以下是当前导致初始和页面加载发生在ViewController.swift
中的代码:
点击按钮导致的操作
@IBAction func changePage(sender: NSButton) {
let newPage = Int(sender.title)
currentPageNumber = newPage!
}
public let pageSize = 200;
public var currentPageNumber : Int{
didSet{
if(fullMorphemesList.count == 0){
return;
}
loadMorphemesByPage(currentPageNumber)
}
}
加载项目的逻辑:
///Load morphemes based on page number
func loadMorphemesByPage(pageNumber : Int){
let beginIndex = (pageNumber - 1) * pageSize
let endIndex = pageNumber * pageSize
loadMorphemesIntoDisplay(from: beginIndex, to: endIndex)
}
///Loads morphemes into the collection view
public func loadMorphemesIntoDisplay(from index: Int, to endIndex: Int){
let morphemesToLoad = fullMorphemesList[index..<endIndex]
collectionView.content = (Array(morphemesToLoad) as [AnyObject])
}
希望代码有意义,因为我把它们放在近似的触发顺序中。我错过了额外的步骤吗?我是否可以使用异步UI方法来锁定UI的其余部分,并以正确的顺序更新列表而不会出现可视化工件?
非常感谢!
答案 0 :(得分:1)
使用NSTableView代替可滚动的语素列表,并实现数据源/委托方法(不要忘记表格单元格的reuseIdentifier)。 NSCollectionView还允许支持延迟加载数据源/代理,但在这种情况下已证明更重。通过打开图层并将NSTableRowView的canDrawSubviewsIntoLayer设置为是,您可以获得更多滚动性能改进。
基本上是这样的:
创建您的NSTableCellView子类和xib(再次不要忘记重用标识符)。
使用基于视图的NSTableView注册你的xib并使用里面的reuseIdentifier
func tableView(tableView: NSTableView, viewForTableColumn: NSTableColumn, row: Int) -> NSView