DAY 15 『 Realm 新增、修改、删除 』Part3

昨天分享如何新增、修改、删除、印出 Realm 资料库的资料,以及读取 Realm 资料库的资料去更新 TableView

今天会介绍:

  1. Table View Cell
  2. UITableViewDelegate、UITableViewDataSource、UITextFieldDelegate

在专案底下 New Group / New File / 选 Cocoa Touch Class

在 MyTableViewCell 档里,分别加入各个物件的 @outlet
串连 Storyboard Cell 以及 MyTableViewCell

import UIKit

class MyTableViewCell: UITableViewCell {
    
    @IBOutlet weak var showName: UILabel!
    @IBOutlet weak var showAge: UILabel!
    
    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }
}

extension ViewController: UITableViewDelegate,UITableViewDataSource,UITextFieldDelegate{
    //tableView要显示几列
     func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
        return users.count
    }
    
    //cell里面要显示什麽
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! MyTableViewCell
        // Cell contents setting
        cell.showName.text = users[indexPath.row].setuserName
        cell.showAge.text = users[indexPath.row].setuserAge
        tableView.deleteRows(at: [indexPath], with:.fade)
        return cell
    }
    // view 询问有多少 section 要显示
    func numberOfSections(in tableView: UITableView) -> Int { return 1 }
    
    //textField的限制
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
       var result = false
       if let text = textField.text, let range = Range(range, in: text) {
           let newText = text.replacingCharacters(in: range, with: string)
           // 最多输入 10 个数值
           if newText.count < 11 {
            result = true
           }
       }
       return result
    }
}

由於 UITableViewDelegate、UITableViewDataSource、UITextFieldDelegate 是用 extension 的方式宣告
因此在 override func viewDidLoad() 底下需加上

tableView.delegate = self
tableView.dataSource = self

在 Storyboard 将 CollectionView 拉线到 View Controller,选择 delegate & dataSource

拉完後就会呈现这样

附上完整程序码

//  Datas.swift

import UIKit
import Foundation
import RealmSwift
class Datas: Object {
    @objc dynamic var id = UUID().uuidString
    @objc dynamic var name = ""
    @objc dynamic var age = 0
    override static func primaryKey() -> String? {
        return "id"
    }
}
//  MyTableViewCell.swift

import UIKit
class MyTableViewCell: UITableViewCell {
    
    @IBOutlet weak var showName: UILabel!
    @IBOutlet weak var showAge: UILabel!
    
    override func awakeFromNib() {
        super.awakeFromNib()
    }
}
//  ViewController.swift

import RealmSwift
import UIKit
struct SetUser {
    var setuserName : String?
    var setuserAge : String?
    init(setuserName: String, setuserAge:String){
        self.setuserName = setuserName
        self.setuserAge = setuserAge
    }
}
class ViewController: UIViewController {
    let realm = try! Realm()
    var users = [SetUser]()
    
    @IBOutlet weak var nameTextField: UITextField!
    @IBOutlet weak var ageTextField: UITextField!
    @IBOutlet weak var inputButton: UIButton!
    @IBOutlet weak var deleteTextField: UITextField!
    @IBOutlet weak var deleteButton: UIButton!
    @IBOutlet weak var fixTextField: UITextField!
    @IBOutlet weak var fixButton: UIButton!
    @IBOutlet weak var findTextField: UITextField!
    @IBOutlet weak var findButton: UIButton!
    @IBOutlet weak var tableView: UITableView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        reloadData()
        
        tableView.delegate = self
        tableView.dataSource = self
        
        print("fileURL: \(realm.configuration.fileURL!)")
        
        let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismissKeyBoard))
        self.view.addGestureRecognizer(tap)
    }

    @IBAction func inputData(_ sender: UIButton) {
        let input: Datas = Datas()
        if Int(ageTextField.text!) ?? 0 > 0 && (nameTextField.text != nil){
        input.name = nameTextField.text ?? ""
        input.age = Int(ageTextField.text!) ?? 0
        try! realm.write {realm.add(input)}
        }
        else{ alertTrigger();print("输入的资料有误!") }
        reloadData()
    }

    @IBAction func deleteData(_ sender: UIButton) {
        let delete = realm.objects(Datas.self)
        if Int(deleteTextField.text!) ?? 0 > 0 && Int(deleteTextField.text!)! < delete.count+1 {
            try! realm.write { realm.delete(delete[Int(deleteTextField.text!)!-1]) }
        }
        else{ alertTrigger();print("输入值有误!") }
        reloadData()
    }

    @IBAction func fixData(_ sender: UIButton) {
        let fixid = realm.objects(Datas.self)
        if (fixTextField.text != nil) && (fixid.count > 0){
            let fix: Datas = Datas()
            fix.id = "\(fixid[0].id)"
            fix.name = fixTextField.text!
            fix.age = fixid[0].age
            try! realm.write {realm.add(fix, update: .all)}
        }
        else{ alertTrigger();print("目前没资料!") }
        reloadData()
    }

    @IBAction func findData(_ sender: UIButton) {
        let show = realm.objects(Datas.self)
        if Int(findTextField.text!) ?? 0 > 0 && Int(findTextField.text!)! < show.count+1 && show.count > 0{
            print("name:\(show[ Int(findTextField.text!)!-1].name),age:\(show[Int(findTextField.text!)!-1].age)")
        }
        else{ alertTrigger();print("输入值有误") }
    }

    func reloadData(){
        users = []
        let alluser = realm.objects(Datas.self)
        guard alluser.count > 0 else { tableView.reloadData(); print("nil"); return }
        for i in 1...alluser.count{
            users.append(SetUser(setuserName: alluser[i-1].name, setuserAge: String(alluser[i-1].age)))
        }
        tableView.reloadData()
    }

    func alertTrigger(){
        let alertController = UIAlertController(title: "提示", message: "请确认输入的资料,按确认关闭!", preferredStyle: .alert)
        let confirmAction = UIAlertAction(title: "确认", style: .default, handler: nil)
        alertController.addAction(confirmAction)
        self.present(alertController, animated: true, completion: nil)
    }
    
    @objc func dismissKeyBoard() { self.view.endEditing(true) }
}

extension ViewController: UITableViewDelegate,UITableViewDataSource,UITextFieldDelegate{
     func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
        return users.count
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! MyTableViewCell
        cell.showName.text = users[indexPath.row].setuserName
        cell.showAge.text = users[indexPath.row].setuserAge
        tableView.deleteRows(at: [indexPath], with:.fade)
        return cell
    }
    func numberOfSections(in tableView: UITableView) -> Int { return 1 }
    
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
       var result = false
       if let text = textField.text, let range = Range(range, in: text) {
           let newText = text.replacingCharacters(in: range, with: string)
           if newText.count < 11 {
            result = true
           }
       }
       return result
    }
}

这样就完成啦!明天会有新的实作分享,敬请期待!


<<:  Day 21: Convolutional Neural Networks — 卷积神经网路初探(下)

>>:  D-18 生命周期 ? request pipeline ? di lifecycle

Day02,先来建个开发资料库好了。

正文 预计会用到一个资料库提供给後端API使用,先来在家用NAS上用container来建立一个Po...

Day 23 - Tailwind Plugin 使用 (二) => Typography

这两天大家好像都在绑定数位五倍券和抢银行优惠,还有登记一些抽签的加码券,结果造成系统大当机。威尔猪...

[资料库] 学习笔记 - case when then 和 预存程序 之2

这次的问题是上一篇文的延伸 上一篇是使用者输入参数後,再将指定栏位的值改为1 那这次是输入参数後检查...

Day 30 - Finite State Machine x XState 推荐学习资源

说到学习资源,最容易学习的方式就是从母语开始 中文文章 Jerry Hong 的部落格 Jerry ...

影音串流辛酸史

影音串流的解决方案有很多,可以自己从 IaaS 架设,像是使用 AWS/GCP/Azure 启动虚拟...