swift个人通讯录

本文介绍了一个使用Swift实现的个人通讯录应用案例,重点讲解了如何利用闭包进行数据处理及Storyboard进行界面间的跳转与传值。通过具体代码展示了闭包的特点及其在实际项目中的运用,并详细说明了Storyboard在iOS开发中的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

注意:在做个人通讯录的时候第一次使用storyboard,stroyboard之间跳转传值。还有就是使用闭包回调

  • ListTableViewController
import UIKit
class ListTableViewController: UITableViewController {
    /**
     block 特点
     1 定义block可以和当前上下文一起使用
     2 便于阅读和维护
     3 可以根据不同的需要传递不同的代码
     */

    // 声明一个联系人数组
    var personList = [Person]()

    override func viewDidLoad() {
        super.viewDidLoad()

        addData { (listArray) in
            // 拼接数组 闭包中定义好的代码在需要的时候执行,需要self.指定语境
            self.personList += listArray

            // 刷新表格
            self.tableView.reloadData()
        }
    }

    // 添加保存
    @IBAction func addPerson(_ sender: Any) {
         performSegue(withIdentifier: "list2stail", sender: nil)
    }
}


extension ListTableViewController {
    private func addData(completion:@escaping (_ list:[Person])->()) {
        DispatchQueue.global().async {
            var listArray = [Person]()
            print("延迟两秒加载数据")
            Thread.sleep(forTimeInterval: 2)
            for i in 0..<10{
            let p = Person()
                p.name = "zhang -- \(i)"
                p.iphone = "133" + String(format: "%06d", arc4random_uniform(1000000))
                p.address = "上海"
                listArray.append(p)
            }
            DispatchQueue.main.async {
                completion(listArray)
            }
        }
    }
}

extension ListTableViewController {

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return personList.count
    }
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "Indet", for: indexPath)
        cell.textLabel?.text = self.personList[indexPath.row].name
        cell.detailTextLabel?.text = self.personList[indexPath.row].iphone
        return cell
    }
    /// storyboard 跳转
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        tableView.deselectRow(at: indexPath, animated: true)
        // 使用 segue跳转
        performSegue(withIdentifier: "list2stail", sender: indexPath)
    }

    /// 跳转控制器的方法
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // 类型转型 as
        // swift 中string之外 绝大部分使用 as 需要 ?/!
        // as! / as?直接根据前面的返回值来决定
        let vc = segue.destination as! DetailTableViewController
        // 设置选中的 person indexpath
        // 注意 if let / guard let 判空语句,一律使用as?
        if let indexpath = sender as? IndexPath {
            vc.person = personList[indexpath.row]
            // 设置编辑完成的闭包
            vc.completionCallBack = {
                // 刷新指定行
                self.tableView.reloadRows(at: [indexpath], with: .automatic)
            }
        }else {
            // 新建个人信息
            vc.completionCallBack = { [weak vc] in
                // 获取明细列表person
                guard let p = vc?.person else {
                    return
                }
                // 插入到数组
                self.personList.insert(p, at: 0)
                // 刷新表格
                self.tableView.reloadData()
            }
        }
    }
}
  • DetailTableViewController
class DetailTableViewController: UITableViewController {

    var person:Person?
    // 声明一个闭包 ,闭包是可选的
    var completionCallBack:(() -> ())?

    @IBOutlet weak var nameTextField: UITextField!

    @IBOutlet weak var iPhoneTextField: UITextField!

    @IBOutlet weak var addressTextFiled: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
        //判断person是否有值
        if person != nil {
            nameTextField.text = person?.name
            iPhoneTextField.text = person?.iphone
            addressTextFiled.text = person?.address
        }
    }

    @IBAction func SavePerson(_ sender: Any) {

        // 1 判断person是否为空
        if person == nil {
            person = Person()
        }

        // 2 使用ui更新person的内容
        person?.name = nameTextField.text
        person?.iphone = iPhoneTextField.text
        person?.address = addressTextFiled.text

        // 3 执行闭包
        // oc中执行block前必须判断是否有值,否则容易崩溃
        // ! 强行解包
        // ? 可选解包
        completionCallBack?()

        //4 返回上一级 
      _ = navigationController?.popViewController(animated: true)
    }
}
  • Person
import UIKit

class Person: NSObject {
    var name : String?
    var iphone: String?
    var  address: String?

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值