注意:在做个人通讯录的时候第一次使用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?
}