An amazing project that generates micro reports from tournament results
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

150 lines
4.8 KiB

////////////////////////////////////////////////////////////////////////////
//
// Copyright 2014 Realm Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
////////////////////////////////////////////////////////////////////////////
import UIKit
import RealmSwift
#if !swift(>=4.2)
extension UITableViewCell {
typealias CellStyle = UITableViewCellStyle
typealias EditingStyle = UITableViewCellEditingStyle
}
#endif
class DemoObject: Object {
@objc dynamic var title = ""
@objc dynamic var date = NSDate()
@objc dynamic var sectionTitle = ""
}
class Cell: UITableViewCell {
override init(style: UITableViewCell.CellStyle, reuseIdentifier: String!) {
super.init(style: .subtitle, reuseIdentifier: reuseIdentifier)
}
required init(coder: NSCoder) {
fatalError("NSCoding not supported")
}
}
var sectionTitles = ["A", "B", "C"]
var objectsBySection = [Results<DemoObject>]()
class TableViewController: UITableViewController {
var notificationToken: NotificationToken?
var realm: Realm!
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
realm = try! Realm()
// Set realm notification block
notificationToken = realm.observe { [unowned self] note, realm in
self.tableView.reloadData()
}
for section in sectionTitles {
let unsortedObjects = realm.objects(DemoObject.self).filter("sectionTitle == '\(section)'")
let sortedObjects = unsortedObjects.sorted(byKeyPath: "date", ascending: true)
objectsBySection.append(sortedObjects)
}
tableView.reloadData()
}
// UI
func setupUI() {
tableView.register(Cell.self, forCellReuseIdentifier: "cell")
self.title = "GroupedTableView"
self.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "BG Add", style: .plain, target: self, action: #selector(TableViewController.backgroundAdd))
self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(TableViewController.add))
}
// Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
return sectionTitles.count
}
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return sectionTitles[section]
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return objectsBySection[section].count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! Cell
let object = objectForIndexPath(indexPath: indexPath)
cell.textLabel?.text = object?.title
cell.detailTextLabel?.text = object?.date.description
return cell
}
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
try! realm.write {
realm.delete(objectForIndexPath(indexPath: indexPath)!)
}
}
}
// Actions
@objc func backgroundAdd() {
// Import many items in a background thread
DispatchQueue.global().async {
// Get new realm and table since we are in a new thread
autoreleasepool {
let realm = try! Realm()
realm.beginWrite()
for _ in 0..<5 {
// Add row via dictionary. Order is ignored.
realm.create(DemoObject.self, value: ["title": randomTitle(), "date": NSDate(), "sectionTitle": randomSectionTitle()])
}
try! realm.commitWrite()
}
}
}
@objc func add() {
try! realm.write {
realm.create(DemoObject.self, value: [randomTitle(), NSDate(), randomSectionTitle()])
}
}
}
// Helpers
func objectForIndexPath(indexPath: IndexPath) -> DemoObject? {
return objectsBySection[indexPath.section][indexPath.row]
}
func randomTitle() -> String {
return "Title \(arc4random())"
}
func randomSectionTitle() -> String {
return sectionTitles[Int(arc4random()) % sectionTitles.count]
}