阅读 258

iOS 开发实战点滴-通讯录和侧滑删除cell

随着“客三消”,没前途,没人要了,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)
    }复制代码

通讯录.png

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设计稿的效果:image.png

这是我使用系统代理方法的效果:image.png

设计稿要求删除icon在cell内部,系统方法删除icon是在屏幕边触发,推着整个cell走。这我就不太好搞了,只能自己实现这个侧滑删除操作了么? 有什么建议么??

最快实现方式:

将tableView 换成 UICollectionView + UISwipecell 方式


作者:Eddiegooo
链接:https://juejin.cn/post/7005155835902951437


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐