gpt4 book ai didi

ios - 用 Realm Swift 中的结果中的一些项目制作一个列表

转载 作者:行者123 更新时间:2023-11-28 12:18:01 24 4
gpt4 key购买 nike

我想做的是用 Results 中的项目创建一个 List。我拥有的是一个从 Results 填充的 UITableView。当用户选择行时,我想从这个表中创建一个 List,但是由于某种原因,当我将结果中的项目附加到列表时,没有任何内容附加到 List行被选中。

这是我的代码:

Realm 对象:

import Foundation
import RealmSwift

class Fruit:Object{
dynamic var fruitName:String = ""
dynamic var createdAt = NSDate()
}

View Controller :

var fruits: Results<Fruit>!
var fruitSelectionList: List<Fruit>!

override func viewDidLoad() {
super.viewDidLoad()

updateFruits()

tableFruits.setEditing(true, animated: true)
tableFruits.allowsMultipleSelectionDuringEditing = true
}

func updateFruits(){
fruits = realm.objects(Fruit.self).sorted(byKeyPath: "fruitName")
}

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

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

if let index = fruitSelectionList?.index(of: fruits[indexPath.row]) {
try! realm.write {
fruitSelectionList?.remove(at: index)
}
} else {
try! realm.write {
// nothing gets appended here, why?
fruitSelectionList?.append(fruits[indexPath.row])
}
}
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
if let index = fruitSelectionList?.index(of: fruits[indexPath.row]) {
fruitSelectionList?.remove(at: index)
}
}

有趣的是,不使用 Realm 的类似代码也能正常工作......

在不使用 Realm 时工作的纯 Swift 代码:

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate  {

var fruits = ["Apples", "Oranges", "Grapes", "Watermelon", "Peaches"]

var newFruitList:[String] = []

@IBOutlet weak var tableView: UITableView!

override func viewDidLoad() {
super.viewDidLoad()

tableView.allowsSelection = false
tableView.setEditing(true, animated: true)
tableView.allowsMultipleSelectionDuringEditing = true
}

func numberOfSections(in tableView: UITableView) -> Int {
return 1
}

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell()
cell.textLabel?.text = fruits[indexPath.row]
return cell
}
@IBAction func makeSelection(_ sender: Any) {
tableView.allowsMultipleSelectionDuringEditing = true
tableView.setEditing(true, animated: true)
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

let item = fruits[indexPath.row]
if let index = newFruitList.index(of: item) {
newFruitList.remove(at: index)
} else {
newFruitList.append(fruits[indexPath.row])
}
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
if let index = newFruitList.index(of: fruits[indexPath.row]) {
newFruitList.remove(at: index)
}
}
}

如何使用 Results 中的一些项目制作一个 List

仅供引用 - 我需要创建 List 的唯一原因是能够在表格行选择中添加和删除项目,否则我会坚持只使用结果。

最佳答案

不使用 Realm 时,您的代码完全不同。这个问题与 Realm 无关,它是关于错误地声明 Lists。

您将它们声明为隐式展开的可选值(首先您不应该这样做),然后尝试附加一个 nil 列表。您不能附加 nil,您首先需要一个空的 List。如果您没有使用可选值的安全解包,您将得到运行时异常而不是 nil 结果。

fruitSelectionList 声明为一个空的 List,您就不会遇到这个问题。

var fruits: Results<Fruit>?
var fruitSelectionList = List<Fruit>()

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
if let index = fruitSelectionList?.index(of: fruits[indexPath.row]) {
fruitSelectionList.remove(at: index)
} else {
fruitSelectionList.append(fruits[indexPath.row])
}
}

此外,fruitSelectionList 不是由 Realm 管理的,因为只有 Results 会自动更新,所以你不需要将你的操作在 fruitSelectionList 里面写入事务。您实际上也不需要 fruitSelectionListList 类型,它也可以是 Array

只是一个一般性的建议:如果您需要持久化您的选择,我建议您更新您的 Fruit 模型类以具有类型的 selected 属性Bool 并在选择 tableView 的一行时更新该属性。

关于ios - 用 Realm Swift 中的结果中的一些项目制作一个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45783884/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com