Структура данных для расширяемых и складных секций в UITableview - PullRequest
0 голосов
/ 08 июля 2019

У меня есть UITableViewController, который показывает список транзакций, отсортированных по дате. Это приложение для личных финансов / банковских операций.

Чего я хочу достичь: заголовки разделов (которые показывают дату) должны раскрываться / сворачиваться при нажатии.

Я использую базу данных Realm для хранения данных моей транзакции.

Я начинающий программист, и я пытался найти решение Google, но я застрял, пытаясь создать структуру данных, чтобы отслеживать, открыт ли раздел или закрыт.

Я пытался следовать этому (https://www.youtube.com/watch?v=Q8k9E1gQ_qg&), но я застрял в 12:00.

Модель царства:


class Transaction: Object {
    @objc dynamic var amount: Float = 0
    @objc dynamic var toFrom: String = ""
    @objc dynamic var category : String = ""
    @objc dynamic var date: Date? = nil
    @objc dynamic var note: String = ""
}

Контроллер табличного представления:


class TransactionsViewController : UITableViewController {

    @IBOutlet var transactions2TableView: UITableView!

    let realm = try! Realm()

    var groupedTransactions = [Date:Results<Transaction>]()
    var transactionDates = [Date]()

    override func viewDidLoad() {

        super.viewDidLoad()
        loadTransactions()
    }

override func numberOfSections(in tableView: UITableView) -> Int { 
        return transactionDates.count
    }

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

            return groupedTransactions[transactionDates[section]]!.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell2", for: indexPath)
        let itemsForDate = groupedTransactions[transactionDates[indexPath.section]]!

        cell.textLabel?.text = "\(Array(itemsForDate)[indexPath.row].toFrom)"
        cell.detailTextLabel?.text = "\(String(describing: convertToCurrency(Array(itemsForDate)[indexPath.row].amount)!))"

        return cell

    }

func loadTransactions() {

        let transaction = realm.objects(Transaction.self).sorted(byKeyPath: "date", ascending: false)

        //Find each unique day for which a Transaction exists in your Realm
        transactionDates = transaction.reduce(into: [Date](), { results, currentTransaction in
            let date = currentTransaction.date!
            let beginningOfDay = Calendar.current.date(from: DateComponents(year: Calendar.current.component(.year, from: date), month: Calendar.current.component(.month, from: date), day: Calendar.current.component(.day, from: date), hour: 0, minute: 0, second: 0))!
            let endOfDay = Calendar.current.date(from: DateComponents(year: Calendar.current.component(.year, from: date), month:     Calendar.current.component(.month, from: date), day: Calendar.current.component(.day, from: date), hour: 23, minute: 59, second: 59))!

            //Only add the date if it doesn't exist in the array yet
            if !results.contains(where: { addedDate->Bool in
                return addedDate >= beginningOfDay && addedDate <= endOfDay
            }) {
                results.append(beginningOfDay)
            }
        })

        //Filter each transaction in realm based on their date property and assign the results to the dictionary
        groupedTransactions = transactionDates.reduce(into: [Date:Results<Transaction>](), { results, date in
            let beginningOfDay = Calendar.current.date(from: DateComponents(year: Calendar.current.component(.year, from: date), month: Calendar.current.component(.month, from: date), day: Calendar.current.component(.day, from: date), hour: 0, minute: 0, second: 0))!
            let endOfDay = Calendar.current.date(from: DateComponents(year: Calendar.current.component(.year, from: date), month: Calendar.current.component(.month, from: date), day: Calendar.current.component(.day, from: date), hour: 23, minute: 59, second: 59))!
            results[beginningOfDay] = realm.objects(Transaction.self).filter("date >= %@ AND date <= %@", beginningOfDay, endOfDay)
        })


        self.transactionsTableView.reloadData()
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...