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

时间:2017-08-20 15:37:15

标签: ios swift uitableview realm

我想要做的是使用List中的项目制作Results。我所拥有的是一个由Results填充的UITableView。在此表中,我想在用户选择行时创建List,但由于某些原因,当我选择行时,将结果中的项目附加到列表时,没有任何内容会附加到List。 / p>

这是我的代码:

领域对象:

import Foundation
import RealmSwift

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

的ViewController:

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的类似代码工作得很好......

普通Swift代码在不使用Realm时有效:

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)
        }
    }
}

如何使用List中的某些项目生成Results

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

1 个答案:

答案 0 :(得分:2)

不使用Realm时,您的代码完全不同。该问题与Realm无关,而是错误地声明List s。

您将它们声明为隐式解包的选项(您首先不应该这样做),然后尝试附加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的{​​{1}}属性,选择tableView的一行时更新该属性。