昨天分享如何新增、修改、删除、印出 Realm 资料库的资料,以及读取 Realm 资料库的资料去更新 TableView
今天会介绍:
在专案底下 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
正文 预计会用到一个资料库提供给後端API使用,先来在家用NAS上用container来建立一个Po...
这两天大家好像都在绑定数位五倍券和抢银行优惠,还有登记一些抽签的加码券,结果造成系统大当机。威尔猪...
这次的问题是上一篇文的延伸 上一篇是使用者输入参数後,再将指定栏位的值改为1 那这次是输入参数後检查...
说到学习资源,最容易学习的方式就是从母语开始 中文文章 Jerry Hong 的部落格 Jerry ...
影音串流的解决方案有很多,可以自己从 IaaS 架设,像是使用 AWS/GCP/Azure 启动虚拟...