You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让UITableView中的「Quick Notes」分类始终保持在顶部?

看起来你需要调整分类数组的排序逻辑,同时修改TableView的数据源取数方式,来确保「Quick Notes」始终固定在顶部,新创建的分类紧跟在它下面。我来一步步帮你修改代码:

1. 优化Category模型(可选但推荐)

为了避免依赖标题字符串判断「Quick Notes」(防止用户修改标题后功能失效),建议给Category类添加标记字段和创建时间字段:

// 假设你的Category是Realm Object模型
class Category: Object {
    @Persisted var title: String = ""
    @Persisted var color: String = ""
    @Persisted var icon: String = ""
    @Persisted var createdAt: Date = Date() // 新增:记录创建时间,用于排序
    @Persisted var isQuickNote: Bool = false // 新增:标记是否为Quick Notes
    // 其他已有字段...
}

同步修改创建Quick Notes和通用分类的代码:

private init() { 
    if categories.objects(Category.self).isEmpty { 
        // 创建Quick Notes时标记isQuickNote为true
        createCategoryWith(title: "Quick Notes", color: "#FF0000", icon: "quickNotes", isQuickNote: true) 
    } 
}

// 更新createCategoryWith方法,支持传入isQuickNote参数
func createCategoryWith(title: String, color: String, icon: String, isQuickNote: Bool = false) {
    let category = Category()
    category.title = title
    category.color = color
    category.icon = icon
    category.createdAt = Date()
    category.isQuickNote = isQuickNote
    try! categories.write {
        categories.add(category)
    }
}

2. 修改数组排序逻辑,确保Quick Notes在首位

在ViewController的分类创建回调和初始化加载数组的地方,对获取到的分类数组进行排序:

func didCreateCategory(category: Category) { 
    RealmHandler.shared.createCategoryWith(title: category.title, color: category.color, icon: category.icon) 
    // 排序规则:Quick Notes排第一,其余分类按创建时间倒序(最新的在前)
    let allCategories = RealmHandler.shared.getAllCategories()
    self.categories = allCategories.sorted { cat1, cat2 in
        if cat1.isQuickNote {
            return true // Quick Notes优先级最高
        } else if cat2.isQuickNote {
            return false
        } else {
            // 非Quick Notes分类按创建时间倒序,新创建的紧跟在Quick Notes下方
            return cat1.createdAt > cat2.createdAt
        }
    }
    tableView.reloadData() 
}

// 在viewDidLoad初始化数组时也要应用相同的排序逻辑
override func viewDidLoad() {
    super.viewDidLoad()
    // ...其他初始化代码
    let allCategories = RealmHandler.shared.getAllCategories()
    self.categories = allCategories.sorted { cat1, cat2 in
        if cat1.isQuickNote {
            return true
        } else if cat2.isQuickNote {
            return false
        } else {
            return cat1.createdAt > cat2.createdAt
        }
    }
    tableView.reloadData()
}

3. 修正TableView数据源的取数逻辑

你之前的cellForRowAt方法是倒序取数组元素,这是导致Quick Notes跑到底部的核心原因之一。现在数组已经是正确的顺序,直接按索引取即可:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "categoryCell", for: indexPath) 
    let category = categories[indexPath.row] // 直接取对应位置的分类
    cell.textLabel?.text = category.getTitle() 
    cell.contentView.backgroundColor = hexStringToUIColor(hex: category.getColor()) 
    return cell 
}

4. 确认行数返回逻辑正确

确保你的numberOfRowsInSection方法返回数组的实际长度:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return categories.count
}

补充说明

如果你的Category模型没有createdAt字段,也可以用Realm的ObjectId(如果设置了主键为ObjectId)来判断创建顺序,替换排序逻辑中的时间比较:

// 假设Category的主键是ObjectId
@Persisted(primaryKey: true) var id: ObjectId

// 排序时替换为
return cat1.id.timestamp > cat2.id.timestamp

这样就能完全满足你的需求:刷新数组时Quick Notes固定在顶部,新创建的分类自动显示在它下方。

内容的提问来源于stack exchange,提问作者Martin Hristev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 11:52:41