我怎样才能在表格视图中获得适量的部分。 Swift, 领域

How can i get a right quantity of sections in tableview. Swift, realm

我在领域数据库中有一个 属性“天”,当用户进行一些交易时,我在这里保存所有天数。正是我需要计算的天数才能获得正确数量的部分。现在看起来每笔交易都有一个部分,我希望有一个部分包含一天的所有交易。我的领域模型:

class Items: Object {
@objc dynamic var Amount = 0.0
@objc dynamic var category = ""
@objc dynamic var type = Bool()
@objc dynamic var month = Int()
@objc dynamic var day = Int()

}

typealias Sections = [(quantity: [Int], name: String, items: [Items])]
func getAllItems() -> [Items] {
    var array: [Items] = []
    let objects = realm.objects(Items.self)
    for object in objects {
        array.append(object)
    }
    return array
}
func getSections() -> Sections {
    var sections: Sections = []
    let data = getAllItems()
    var temp = [Items]()
    var summ: [Int] = []
    
        for item in data {
            for item2 in data {
                if item2.day == item.day {
                    summ.append(item.day)
                    temp.append(item)
                }
            }
            sections.append((quantity: summ, name: "\(item.day)", items: temp))
            temp = [Items]()
        }
    return sections
    }

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    RealmModel.shared.getSections()[section].name
}

func numberOfSections(in tableView: UITableView) -> Int {
    RealmModel.shared.getSections().count
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return RealmModel.shared.getSections()[section].name.count
}

事实上,除了“numberOfSections”,其他都有效。我是这样得到它们的:incorrect quantity of sections, I need one section for one day。我不明白我如何才能从 numberOfSections() 中的 getSections() 获得“总和”,或者我如何才能以其他方式获得正确的数量。

尝试使用 completionHandler 解决方案:

typealias Sections = [(quantity: [Int], name: String, items: [Items])]
func getAllItems() -> [Items] {
    var array: [Items] = []
    let objects = realm.objects(Items.self)
    for object in objects {
        array.append(object)
    }
    return array
}
func getSections(completionHandler completion: ((_ quantity: Int) -> Void)?) -> Sections {
    var sections: Sections = []
    let data = getAllItems()
    var temp = [Items]()
    var summ: [Int] = []
    
        for item in data {
            for item2 in data {
                if item2.day == item.day {
                    summ.append(item.day)
                    temp.append(item)
                }
            }
            sections.append((quantity: summ, name: "\(item.day)", items: temp))
            temp = [Items]()
        }
    if let tCompletion = completion {
        tCompletion(temp.count)
    }
    return sections
}

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    RealmModel.shared.getSections()[section].name
}

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

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return RealmModel.shared.getSections()[section].name.count
}

尝试只计算一次部分并保存到一个数组栏中,您可以在 table 查看数据源和委托中使用它。

您的 for 循环可以像您希望的那样工作,因为您在 属性 的同一天继续迭代某些项目。而且您的 numberOfRowsInSection 方法无法正常工作,因为您依赖于部分的名称 属性 而不是项目 属性。虽然我没有关于你的模型的所有信息,但我会这样做:(就像在另一个响应中说的那样,最好保存部分和项目而不是在每次调用 table 查看数据源和委托时获取数据)

typealias Sections = [(quantity: [Int], name: String, items: [Items])]
func getAllItems() -> [Int: [Items]] {
    var array: [Int: [Items]] = [:]
    let objects = realm.objects(Items.self)
    for object in objects {
        if Array(array.keys).contains(object.day) {
            var items = array[object.day]
            items.append(object)
            array[object.day] = items
        } else {
            array[object.day] = [object]
        }
    }
    return array
}
func getSections() -> Sections {
    var sections: Sections = []
    let data = getAllItems()

    for (key, value) in data {
        sections.append((quantity: value.count, name: "\(key)", items: value))
    }
   
    return sections
}

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    RealmModel.shared.getSections()[section].name
}

func numberOfSections(in tableView: UITableView) -> Int {
    RealmModel.shared.getSections().count
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return RealmModel.shared.getSections()[section].items.count
}

我相信 objective 是获取领域 objects 的数组,确定那些 objects 的唯一天数并将它们用作 headers 中的部分一个表视图。所以 tableView 看起来像

Day 1
   item
   item
   item
Day 2
   item
   item
   item

如果是这样的话,这里有一个简单的方法。假设您已经将 Realm 中的项目加载到一个数组中,所以它看起来像这样

let itemArray = [i0, i1, i2, i3, i4, i5, i6, i7, i8, i9]

然后添加一个单独的数组用作节 headers,称为排序日数组

let dayArray = itemArray.map { [=12=].day } //all of the day properties
let daySet = Set(dayArray) //a unique set of day properties
let sortedDayArray = Array( daySet).sorted() //cast the set to a sorted array

所以 sortedDayArray 将是排序的唯一日期数字。从那里得到节数

func numberOfSections(in tableView: UITableView) -> Int {
    sortedDayArray.count
}

并获取任何特定部分的标题

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        let dayNum = sortedDayArray[section]
        let title = "Day \(dayNum)"
        return title
}

然后获取一个部分的行数

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return itemArray.filter { [=15=].day == section }.count
}