日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

IOS之Swift5.x开发通讯录实战

發(fā)布時(shí)間:2023/12/18 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IOS之Swift5.x开发通讯录实战 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

IOS之Swift5.x開發(fā)通訊錄實(shí)戰(zhàn)

swift基礎(chǔ)知識(shí)的使用。
閉包,連線 ,強(qiáng)制解包 頁面的傳值,模型的構(gòu)建、自定義Cell等知識(shí)的使用。

// // LJPerson.swift // 03-Swift通訊錄實(shí)戰(zhàn) // // Created by 魯軍 on 2021/3/12. //import UIKitclass LJPerson: NSObject {@objc var name: String?@objc var age: Int = 0init(dict : [String : Any]) {super.init()setValuesForKeys(dict)}override var description: String{let keys = ["name","age"]return "\(dictionaryWithValues(forKeys: keys))" //字典轉(zhuǎn) 字符串 用\() 外面加雙引號(hào)拼接一下}} // // ViewController.swift // 04-Swift通訊錄實(shí)戰(zhàn)自定義Cell // // Created by 魯軍 on 2021/3/12. //import UIKitclass ViewController: UITableViewController {private var persons : [LJPerson]?override func viewDidLoad() {super.viewDidLoad()print("---")// self.loadData()self.loadData { (array) in// print(array)//記錄接收到的回調(diào)參數(shù)self.persons = array//刷新表格self.tableView.reloadData()}}override func prepare(for segue: UIStoryboardSegue, sender: Any?) {//1 拿到目標(biāo)控制器guard let detailVC = segue.destination as? DetailViewController else {return}//2 獲取用戶當(dāng)前選中行guard let indexPath = tableView.indexPathForSelectedRow else {return}//3.根據(jù)indexPath獲取person數(shù)據(jù)print(persons![indexPath.row])//4傳遞數(shù)據(jù)// 1 個(gè)人記錄detailVC.person = persons![indexPath.row]//2 完成回調(diào)/*detailVC.didSaveCallBack = { ()->() inself.tableView.reloadData()}*///簡(jiǎn)寫 傳遞了一個(gè)可以執(zhí)行的函數(shù)detailVC.didSaveCallBack = self.tableView.reloadData}}//MARK: - 數(shù)據(jù)源方法 extension ViewController {override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {//模型查詢可重用cell 返回UITableCell 沒有personCellde 的屬性//使用 as轉(zhuǎn)換類型 需要使用 ?/ ! => 根據(jù)前面函數(shù)的返回值來決定let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! PersonCell//為什么可以強(qiáng)制解包。 原因。 只有有數(shù)據(jù) ,才會(huì)調(diào)用這個(gè)數(shù)據(jù)源方法//persons一定有內(nèi)容的cell.person = persons![indexPath.row]return cell}override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {//如果persons 數(shù)組為nil 直接返回0/* if persons == nil {return 0}else{//強(qiáng)制解包return persons!.count}*///persons是可選的 可能為空 所以 加個(gè) ?? 0 如果persons 數(shù)組為nil 直接返回0 ?? 是操作符return persons?.count ?? 0} }//extension 類似OC的分類。可以將控制器的代碼分組。便于維護(hù)和管理 //MARK: - 數(shù)據(jù)處理 extension ViewController {private func loadData(completion : @escaping (_ array : [LJPerson]) -> ()){//dispatch_asynclet globalQueue = DispatchQueue.global()globalQueue.async {print("耗時(shí)操作")//創(chuàng)建數(shù)組var dataList = [LJPerson]()for i in 0..<50{let name = "小花 \(i)"let age = arc4random_uniform(10) % 20 + 10let dict : [String : Any] = ["name" : name,"age" : age]dataList.append(LJPerson(dict: dict))}//測(cè)試數(shù)據(jù)`//print(dataList)DispatchQueue.main.async {//操作完成的回調(diào)print("完成回調(diào)")completion(dataList)}}}} // // PersonCell.swift // 04-Swift通訊錄實(shí)戰(zhàn)自定義Cell // // Created by 魯軍 on 2021/3/12. //import UIKitclass PersonCell: UITableViewCell {//個(gè)人模型 swift 中設(shè)置模型可以用 didSetvar person : LJPerson? {//可選的didSet{// 不需要使用` _成員變量=變量 ` 因?yàn)橐呀?jīng)完成了設(shè)置了//當(dāng)person模型設(shè)置值完成后。執(zhí)行的代碼nameLabel.text = person?.nameageLabel.text = "\(person?.age ?? 0)"}}@IBOutlet weak var nameLabel: UILabel!@IBOutlet weak var ageLabel: UILabel! } // // DetailViewController.swift // 04-Swift通訊錄實(shí)戰(zhàn)自定義Cell // // Created by 魯軍 on 2021/3/12. //import UIKitclass DetailViewController: UIViewController {//定義閉包屬性var didSaveCallBack: (() -> ())?//個(gè)人數(shù)據(jù)模型var person : LJPerson?//{ // didSet{ // //在傳遞的時(shí)候。控制器已經(jīng)被創(chuàng)建。但是控制器的視圖沒有被創(chuàng)建 // //視圖沒有被創(chuàng)建 那么子視圖同樣沒有創(chuàng)建 // //EXC_BAD_INSTRANCE 野指針 // //一旦使用了view 如果view 為nil 會(huì)調(diào)用loadView() 創(chuàng)建view 以及子視圖 // nameText.text = person?.name // ageText.text = "\(person?.age ?? 0)" // // } // }@IBOutlet weak var nameText: UITextField!@IBOutlet weak var ageText: UITextField!@IBAction func save(_ sender: Any) {//1使用UI更新模型person?.name=nameText.text//第一個(gè) ! 保證字符串一定有內(nèi)容//第二個(gè) ! 保證一定能夠轉(zhuǎn)成整數(shù)//person?.age=Int(ageText.text!)!person?.age=Int(ageText.text!) ?? 0print(person)//2完成回調(diào)。 通知控制器刷新數(shù)據(jù) !閉包// ? 表示如果閉包不存在 就不執(zhí)行。-》 OC 中調(diào)用block 一定要判斷//如果強(qiáng)行解包 同時(shí)沒有設(shè)置數(shù)值 會(huì)崩潰didSaveCallBack?()//關(guān)閉控制器navigationController?.popViewController(animated: true)}@IBAction func textChange() {//兩個(gè)框子都有值 按鈕才能高亮保存按鈕navigationItem.rightBarButtonItem?.isEnabled = nameText.hasText && ageText.hasText}override func viewDidLoad() {super.viewDidLoad()nameText.text = person?.nameageText.text = "\(person?.age ?? 0)"//激活按鈕self.textChange()}/*// MARK: - Navigation*/ }

總結(jié)

以上是生活随笔為你收集整理的IOS之Swift5.x开发通讯录实战的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。