美文网首页
swift 枚举在tableview上的用法

swift 枚举在tableview上的用法

作者: flyrr | 来源:发表于2016-08-04 13:05 被阅读221次

假如有一个账号信息页面,布局如下。。你该如何设置你的数据源呢,以及该如何处理你的tableview的点击代理呢???


Simulator Screen Shot 2016年8月4日 下午12.48.18.png

以往,也就是大部分的数据源问题我就不列出来了。。。
我写下大部分人的点击代理的写法

func didSelectRowAtIndexPath(indexPath: NSIndexPath, atContol control: UIViewController) {
        switch indexPath.section {
        case 0:
            switch indexPath.row {
            case 0:
                print("头像")
            case 1:
                print("用户名")
            case 2:
                print("ID")
            case 3:
                print("等级")
            case 4:
                print("vip")
            default:
                print("密码")
            }
        case 1:
            print("身份证")
        case 2:
            print("银行")
        case 3:
            print("qq")
        case 4:
            print("淘宝")
        default:
            print("京东")
        }
    }

上面这个写法很正确。。。。没有什么可以说的。但是你就不觉得代码很难看吗???
而且你还要去看看数据源中对应的是哪个???比如,你还得看看等级是在那个section,哪个row
假如说第2个分区有3个row呢,第三个分区有5个row呢。。。。那你这个方法里全是switch case 了,嵌套在嵌套,累不累

你累不累啊。。。你就不想换个其它思路,其它写法???

开工~~~啥都不说了,上代码

首先定义一个枚举


/**
 账号信息页面枚举
 
 - Icon:     头像
 - Name:     用户名
 - ID:       ID
 - Level:    用户等级
 - Vip:      我的Vip
 - Password: 用户密码
 - Card:     身份证信息
 - Bank:     银行卡
 - QQ:       QQ号
 - TB:       淘宝
 - JD:       京东
 */
enum AccountMenu: Int {
    case Icon = 0, Name, ID, Level, Vip, Password, Card, Bank, QQ, TB, JD
}

//这里我设置的枚举类型是Int,当然你也可以根据需求设置其它类型
Swift
枚举中支持以下四种关联值类型:
整型(Integer)
浮点数(Float Point)
字符串(String)
布尔类型(Boolean)

然后为这个枚举写个扩展

extension AccountMenu {
    /// 信息页面菜单的信息(标题----图像----下一个控制器)
    var menuInfo: (title: String, icon: UIImage?, nextControl: UIViewController?) {
        get {
            switch self {
            case .Icon:
                return ("头像", ACCOUNT_ICON, nil)
            case .Name:
                return ("用户名", ACCOUNT_NAME, nil)
            case .ID:
                return ("ID", ACCOUNT_ID, nil)
            case .Level:
                return ("用户等级", ACCOUNT_LEVLE, nil)
            case .Vip:
                return ("我的vip", ACCOUNT_VIP, nil)
            case .Password:
                return ("用户密码", ACCOUNT_PWD, nil)
            case .Card:
                return ("身份证信息", ACCOUNT_CARD, nil)
            case .Bank:
                return ("银行卡", ACCOUNT_BANK, nil)
            case .QQ:
                return ("QQ号", ACCOUNT_QQ, UIViewController())
            case .TB:
                return ("淘宝", ACCOUNT_TB, nil)
            case .JD:
                return ("京东", ACCOUNT_JD, nil)
            }
        }
        set {
            
        }
    }
}

尽管增加一个存储属性到枚举中不被允许,但你依然能够创建计算属性。当然,计算属性的内容都是建立在枚举值下或者枚举关联值得到的。

然后在viewModel里面设置数据源

struct AccountViewModel {
    
    /// 数据源---[key: [(数组(AccountMenu))]]
    private let dataSource: [String: [AccountMenu]] = ["0": [.Icon, .Name, .ID, .Level, .Vip, .Password], "1": [.Card], "2": [.Bank], "3": [.QQ], "4": [.TB], "5": [.JD]]
}

我敢保证这个数据源,比绝大部分人的数据源要好看些。。。。。

后面的就是处理了。。。。我就直接上代码了

extension AccountViewModel {
    func numberOfSections() -> Int {
        return dataSource.count
    }
    
    func numberOfRowsInSection(section: Int) -> Int {
        guard let count = dataSource["\(section)"]?.count else {
            return 0
        }
        return count
    }
    
    func cellForRowAtIndexPath(indexPath: NSIndexPath, atTableView tableView: UITableView) -> UITableViewCell {
        let identifier = "accountRootCell"
        var cell = tableView.dequeueReusableCellWithIdentifier(identifier)
        if cell == nil {
            cell = UITableViewCell(style: .Value1, reuseIdentifier: identifier)
        }
        cell?.separatorInset = UIEdgeInsetsZero
        if let sectionArr = dataSource["\(indexPath.section)"] {
            cell?.imageView?.image = sectionArr[indexPath.row].menuInfo.icon
            cell?.textLabel?.text = sectionArr[indexPath.row].menuInfo.title
        }
        return cell!
    }
    

func didSelectRowAtIndexPath(indexPath: NSIndexPath, atContol control: UIViewController) {
        guard let sectionArr = dataSource["\(indexPath.section)"],
            let nextVC = sectionArr[indexPath.row].menuInfo.nextControl else {
                return
        }
        nextVC.hidesBottomBarWhenPushed = true
        control.navigationController?.pushViewController(nextVC, animated: true)
    }
}

当然如果你要处理点击事件。。你也可以按照下面这个写法

func didSelectRowAtIndexPath(indexPath: NSIndexPath, atContol control: UIViewController) {
        guard let sectionArr = dataSource["\(indexPath.section)"] else {
            return
        }
        let type = sectionArr[indexPath.row]
        print(type)
        //如果你想做其他动作---可以直接按照下面这个来了
        switch type {
        case .Icon:
            print("icon")
        case .Name:
            print("name")
        case .ID:
            print("id")
        case .Level:
            print("level")
        case .Vip:
            print("vip")
        case .Password:
            print("pwd")
        case .Card:
            print("card")
        case .Bank:
            print("bank")
        case .QQ:
            print("qq")
        case .TB:
            print("tb")
        case .JD:
            print("jd")
        }
    }

在这里。。。你就不用按照indexPath来区分了,而是直接来按照枚举类型来做的。。。。代码是比最上面那个方法多,但是你不觉得这代码写的很好看吗????

当然swift的枚举还有其它更NB的用法。。这里我暂时还没有搞明白,等过段时间再写swift枚举的其它用法吧

相关文章

  • swift 枚举在tableview上的用法

    假如有一个账号信息页面,布局如下。。你该如何设置你的数据源呢,以及该如何处理你的tableview的点击代理呢??...

  • swift语法记录-之枚举

    枚举的基本用法 在C,OC中,枚举就是整形,0,1,2,3...在swift中的基本用法 关联值(Associat...

  • Swift探索(五): Enum & Optional

    一:枚举(Enum) 1. 枚举的基本用法 Swift 中通过 enum 关键字来声明一个枚举 Swift 中的枚...

  • Swift 枚举

    Swift的枚举在功能上比OC强了很多,在Swift中枚举更倾向于类了 常规用法 成员变量,方法及协议 enum有...

  • Swift enum(枚举)使用范例

    来源:Swift 中枚举高级用法及实践Advanced & Practical Enum usage in Swift

  • iOS-Swift-枚举

    Swift中的枚举比OC中的枚举更强大。 一. 枚举的基本用法 二. 关联值(Associated Values)...

  • Swift 枚举(enum)详解

    Swift 枚举(enum)详解 [TOC] 本文将介绍Swift中枚举的一些用法和其底层原理的一些探索,以及探索...

  • Swift枚举高级用法文章

    [Swift 中枚举高级用法及实践]http://swift.gg/2015/11/20/advanced-pra...

  • Swift 模式匹配总结

    Swift 模式匹配总结 基本用法 对枚举的匹配: 在swift中 不需要使用break跳出当前匹配,默认只执行一...

  • ★ iOS高级:Swift入门精讲③ 01 swift编程-02

    前言:本篇仅为视频学习笔记 枚举的基本用法我们开看一下,Swift中的枚举,一说到枚举,在以前学习C语言当中也知道...

网友评论

      本文标题:swift 枚举在tableview上的用法

      本文链接:https://www.haomeiwen.com/subject/phmcsttx.html