【问题标题】:How can i get a right quantity of sections in tableview. Swift, realm如何在 tableview 中获得正确数量的部分。迅捷,领域
【发布时间】:2021-01-04 10:53:05
【问题描述】:

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

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() 中仅获得“总和”,或者我如何才能以另一种方式获得正确的数量。

【问题讨论】:

  • 为什么不将日期存储在 List 属性中?然后您可以使用let count = daysList.count 获取天数。或者也许创建一个“交易日”模型,该模型在 List 属性中包含当天的所有交易。也许如果您可以包含您的领域模型,我们可以帮助简化这一点。
  • @Jay,添加了领域模型。另外,我认为,我需要从一个数组中获取 tableview 的数据以避免错误。但我很高兴看到您的解决方案。
  • 好的,这有帮助。我添加了一个答案,应该可以大大简化你正在做的事情。

标签: ios swift realm


【解决方案1】:

您的 for 循环可以像您希望的那样工作,因为您继续迭代具有与以前某些项目相同的日期属性的项目。并且您的 numberOfRowsInSection 方法无法正常工作,因为您依靠部分的 name 属性而不是 items 属性。虽然我没有关于您的模型的所有信息,但我会这样做:(就像在另一个回复中说的那样,最好保存部分和项目,而不是在每次调用表视图数据源和委托时获取数据)

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
}

【讨论】:

  • 我的模型:类项目:对象 { objc 动态 var Amount = 0.0 objc 动态 var 类别 = "" objc 动态 var 类型 = Bool() objc 动态 var 月 = Int() objc 动态 var 日 =整数()}
  • 还有一些错误,我该如何解决?代码图片:yadi.sk/i/bz4MOFkUudhtIg 感谢您的帮助!我已经这样做了一个星期,但无法完成
  • 我编辑了代码以纠正错误。我没有改变函数getAllItems的返回类型
  • 感谢您的帮助,这是新年后最好的礼物!最后一个问题,如何在百货商店中进行交易,然后更新,然后更高。因为现在最旧的交易在部分的顶部。
  • 类似这样的:sections.sorted { $0.name > $1.name } 在 getSections 函数中 return sections 之前
【解决方案2】:

使用 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
}

【讨论】:

  • 我想,getSections() 入口我不应该给任何东西,因为有很多错误
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    我相信目标是获取领域对象数组,确定这些对象的唯一天数,并将它们用作 tableView 中的部分标题。所以 tableView 看起来像

    Day 1
       item
       item
       item
    Day 2
       item
       item
       item
    

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

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

    然后添加一个单独的数组用作节标题,称为排序天数组

    let dayArray = itemArray.map { $0.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 { $0.day == section }.count
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-25
      • 2017-03-13
      • 1970-01-01
      • 2019-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多