随着“客三消”,没前途,没人要了,49年入国军等调侃 ,iOS开发新人越来越少了。但终究还是有,因此记录点实际开发的应用,如果能给新学习的一点点帮助就很好了(我也刚从OC转到swift开发,所以后面的都是swift代码,如果新人也建议直接学swift)。 大佬、熟手请直接拉到最下面,看下那个问题就 ctrl+w吧[doge]
一、通讯录相关
需求 —— 获取通讯录内容,不需要修改,只需要获取联系人方式,方便联系即可。
只获取通讯录内容,不涉及修改,不用申请权限,不用申请权限,不用申请权限!
1、首先调起系统通讯录
现在一般App最低支持系统都在iOS 9以上了,所以iOS 9以下方法不介绍了。
导入 import ContactsUI
,直接弹出系统通讯录VCCNContactPickerViewController
,遵循代理方法CNContactPickerDelegate
,就这么简单就完成了。
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
let contactPick = CNContactPickerViewController()
contactPick.delegate = self
self.present(contactPick, animated: true, completion: nil)
}
2、光弹出来没用,还要可以选择。 选择哪个联系人,实现代理方法即可.
单选联系人:有下面两个代理方法,只实现一个方法就好。 方法一优先于方法二执行。
两个方法的区别见代码注释, 就差到这里。第二个方法主要用于当一个联系人有多个电话号码时,你可以进到详情页里面选择具体你要的那个。
// 在通讯录列表里选择
func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) {
}
// 可以进到通讯录个人详情页里选择
func contactPicker(_ picker: CNContactPickerViewController, didSelect contactProperty: CNContactProperty) {
let familyName = contactProperty.contact.familyName
let givenName = contactProperty.contact.givenName
var phoneNum = ""
// 即使有多个电话,你选择了哪个,就返回的是哪个。 不用在额外设置,你到底选了哪个
if let phone = contactProperty.value as? CNPhoneNumber {
phoneNum = phone.stringValue
}
}
ps:在个人信息详情页里面,我们一般不需要把所有信息都显示出来。 具体显示什么通过这个displayedPropertyKeys
属性可以配置。
displayedPropertyKeys = [CNContactPhoneNumbersKey]
这样在详情页就只显示电话号码。地址、邮箱等都显示。
3、想要实现多选联系人,实现下面代理方法之一即可。 区别和上面单选是一样的,一个在列表,一个在详情里选择(我认为应该是这样,但事实不这样!!!)。
func contactPicker(_ picker: CNContactPickerViewController, didSelect contacts: [CNContact]) {
}
func contactPicker(_ picker: CNContactPickerViewController, didSelectContactProperties contactProperties: [CNContactProperty]) {
}
经过我的测试,多选怎么着都不会进入详情里选择。 难道是我姿势不对么??? 因此建议:当想要多选时,直接用方法一最好。
而且方法二想要有效果,就必须要设置下面的属性才有效,但是也不能进到详情里面!!! 姿势不对么?
contactVC.predicateForSelectionOfProperty = NSPredicate(format: "key == 'emailAddresses'")
NSPredicate(format: "key == 'phoneNumbers'", argumentArray: nil)
最后: 系统通讯录还有很多属性提供,一般都是限制操作的,自己点进去看就好了,这里不多介绍。
TableView 实现侧滑删除cell操作
简单实现,只用系统代理方法完成 iOS 11系统之前要几个代理方法合作完成,iOS 11之后一个方法就完成,方便多了
iOS 11之后代理方法
// iOS 11之后一个方法搞定删除
func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration? {
let deleteAction = UIContextualAction(style: UIContextualAction.Style.destructive, title: "删除") { _,_,_ in
// 删除操作
}
return UISwipeActionsConfiguration(actions: [deleteAction])
}
还可以限制一下哪些cell可以侧滑删除
// 允许侧滑删除方法
func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
if "不符合条件" {
return false
}
return true
}
iOS 11之前之前要几个方法,删除设置与执行分开了代理方法。
// 删除名称
func tableView(_ tableView: UITableView, titleForDeleteConfirmationButtonForRowAt indexPath: IndexPath) -> String? {
return "delete"
}
func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle {
return .delete
}
// 执行操作
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
// 删除操作
}
现在有一个问题点:
这是UI设计稿的效果:
这是我使用系统代理方法的效果:
设计稿要求删除icon在cell内部,系统方法删除icon是在屏幕边触发,推着整个cell走。这我就不太好搞了,只能自己实现这个侧滑删除操作了么? 有什么建议么??
最快实现方式:
将tableView 换成 UICollectionView + UISwipecell 方式