• swift 3.0中纯代码自定义UITableViewCell的使用, 自定义cell:class CustomCell: UITableViewCell { var titleLabel:UILabel? var picImgView:UIImageView? required init?(coder aDecoder:NSCoder) { super....

    在swift 3.0中纯代码自定义UITableViewCell的使用,
    自定义cell:

    class CustomCell: UITableViewCell {
    
        var titleLabel:UILabel?
        var picImgView:UIImageView?
    
        required init?(coder aDecoder:NSCoder) {
            super.init(coder: aDecoder)
        }
    
        override init(style:UITableViewCellStyle, reuseIdentifier:String?) {
    
            super.init(style: style, reuseIdentifier: reuseIdentifier)
            self.setUpUI();
        }
    
        func setUpUI() {
    
            self.titleLabel = UILabel.init()
            self.titleLabel?.backgroundColor = UIColor.clear;
            self.titleLabel?.frame = CGRect(x:0, y:0, width:100, height:30)
            self.titleLabel?.text = "Title"
            self.titleLabel?.textColor = UIColor.black
            self.titleLabel?.font = UIFont.systemFont(ofSize: 15)
            self.titleLabel?.textAlignment = NSTextAlignment.center
            self.addSubview(self.titleLabel!)
    
            self.picImgView = UIImageView()
            self.picImgView?.frame = CGRect(x:110, y:50, width:50, height:50)
            self.picImgView?.backgroundColor = UIColor.lightGray
            self.picImgView?.image = UIImage.init(named: "a")
            self.addSubview(self.picImgView!)
    
        }

    ViewController中的主要代码,实例化UITableView,在这里,CGRect的用法和Swift2.0的有所不同了

    func setLayout() {
    
            mainTable = UITableView.init(frame: CGRect(x: 0, y: 20, width:self.view.frame.size.width, height:self.view.frame.size.height - 20), style: UITableViewStyle.plain)
            mainTable?.backgroundColor = UIColor.white
            mainTable?.delegate = self;
            mainTable?.dataSource = self;
            self.view.addSubview(mainTable!)
        }

    UITableView的行数,行高,Section部分的代码就不展示了,cellForRowIndexPath的方法和Object-C以及Swift 2.0的有所不同,所以在这里给出,供参考
    “`
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let reuStr:String = "ABC" 
        if cell == nil {         
        cell=CustomCell(style:UITableViewCellStyle.default, reuseIdentifier: reuStr)
        }
        cell.titleLabel?.text = "OOKK"
        tableView.separatorStyle = UITableViewCellSeparatorStyle.none;
        cell.selectionStyle = UITableViewCellSelectionStyle.none
        return cell
    }
    

    展开全文
  • swift自定义cell的坑

    2016-05-13 17:50:17
    swift自定义cell的坑

    原帖:http://draveness.me/swift-zhong-init-de-shi-yong/


    首先说下 Swift 给我带来的感受吧, Swift 的刚开始使用的时候感觉还是太特么难用了可以的.

    不过 Xcode 在 Swift 上的补全极其慢, 因为 Swift 所有的属性方法都是默认公开的, 所以可能是因为每次都要搜索全局的符号导致自动补全非常缓慢, 严重影响了工作效率, 有同样的问题的请戳这里. 当然也不排除我电脑配置的影响, 不过重写的过程还是蛮顺利的, 没有遇到太多的问题, 而且使用了很多 Swift 的高级特性来缩减原来冗长的 ObjC 代码.

    构造器 init

    好了然后, 谈一下我在这两天中写 Swift 时遇到的最大问题 ---- 构造器 init 的使用.

    注: 我们在这篇博客中提到的构造器都为类构造器, 在这里不提及值构造器的使用,详见文档.

    刚刚使用这个构造器的时候我感觉到很困惑啊, 不就是个 init, 你给我搞这么多事情干什么? 我只想安安静静地初始化

    开始使用 init

    当我遵从以前写 ObjC 的习惯, 在 Swift 中键入 init 之后, 编译器提醒我:

    'required' initialize 'init(coder:)' must be provided by subclass of 'UITableViewCell'  
    

    这是什么意思(,,#゚Д゚), 好吧, 这个错误竟然可以点. 于是开心地双击, 然后呢, Xcode 在我们的屏幕中自动生成了这些东西:

    required init(coder aDecoder: NSCoder) {  
        fatalError("init(coder:) has not been implemented")
    }
    

    随后, 我就如在 ObjC 中一样在 init 方法中调用了 super.init(), (/= _ =)/~┴┴ 怎么还有错误?

    这是啥意思?

    Must call a designated initializer of the superclass 'UITableViewCell'  
    

    必须调用一个 UITableViewCell 的指定构造器. 算了先不管了, 继续写好了. 于是又出现呢了下面的提示:

    Convenience initializer for 'TableViewCell' must delegate (with 'self.init') rather than chaining to a superclass initializer (with 'super.init')  
    

    既然说 convenience 构造器不能调用 super.init, 那么按照错误提示改成 self.init应该就好了.

    Could not find member 'Default'  
    

    既然报了这个错误, 那么如果加上 UITableViewCellStyle 呢

    Could not fond an overload for 'init' that accepts the supplied arguments  
    

    找不到 init 方法接收所提供参数的重载.

    最后一个常见的错误大概是这样的

    Property 'self.label' not initialized at super.init call  
    

    Orz, 到这里我已经放弃了自己通过尝试来解决这些问题了. 于是我求助于 Google, 最后怒看苹果的官网文档并找到了以上错误的全部答案.

    使用 init 方法的正确姿势

    苹果的官方文档关于构造器的部分请戳这里

    在 Swift 中, 类的初始化有两种方式, 分别是

    1. Designated Initializer
    2. Convenience Initializer

    Designated Initializer 在本篇博客中译为指定构造器, 而 Convenience Initializer 译为便利构造器.

    指定构造器在一个类中必须至少有一个, 而便利构造器的数量没有限制.

    指定构造器(Designated Initializer)

    Designated initializers are the primary initializers for a class. A designated initializer fully initializes all properties introduced by that class and calls an appropriate superclass initializer to continue the initialization process up the superclass chain.

    指定构造器是类的主要构造器, 要在指定构造器中初始化所有的属性, 并且要在调用父类合适的指定构造器.

    每个类应该只有少量的指定构造器, 大多数类只有一个指定构造器, 我们使用 Swift 做 iOS 开发时就会用到很多 UIKit 框架类的指定构造器, 比如说:

    init()  
    init(frame: CGRect)  
    init(style: UITableViewCellStyle, reuseIdentifier: String?)  
    

    这些都是类指定构造器, 并且这些方法的前面是没有任何的关键字的(包括 override).

    当定义一个指定构造器的时候, 必须调用父类的某一个指定构造器:

    init(imageName: String, prompt: String = "") {  
        super.init(style: .Default, reuseIdentifier: nil)
        ...
    }
    

    在这里我们的指定构造器调用了父类的指定构造器 super.init(style: .Default, reuseIdentifier: nil).

    便利构造器(Convenience Initializer)

    Convenience initializers are secondary, supporting initializers for a class. You can define a convenience initializer to call a designated initializer from the same class as the convenience initializer with some of the designated initializer’s parameters set to default values. You can also define a convenience initializer to create an instance of that class for a specific use case or input value type.

    便利构造器是类的次要构造器, 你需要让便利构造器调用同一个类中的指定构造器, 并将这个指定构造器中的参数填上你想要的默认参数.

    如果你的类不需要便利构造器的话, 那么你就不必定义便利构造器, 便利构造器前面必须加上 convenience 关键字.

    在这里我们就不举例了, 但是我们要提一下便利构造器的语法:

    convenience init(parameters) {  
        statements
    }
    

    init 规则

    定义 init 方法必须遵循三条规则

    1. 指定构造器必须调用它直接父类的指定构造器方法.
    2. 便利构造器必须调用同一个类中定义的其它初始化方法.
    3. 便利构造器在最后必须调用一个指定构造器.

    如下图所示:

    在图中, 只有指定构造器才可以调用父类的指定构造器, 而便利构造器是不可以的, 这也遵循了我们之前所说的三条规则.

    只要 init 方法遵循这三个规则就不会有任何问题.

    • 不过为什么要遵循这三条规则呢?
    • init 的方法的调用机制是什么呢?

    init 机制

    在 Swift 中一个实例的初始化是分为两个阶段的

    1. 第一阶段是实例的所有属性被初始化.
    2. 第二阶段是实例的所有属性可以再次的调整以备之后的使用.

    而这与 ObjC 的区别主要在于第一部分, 因为在 ObjC 中所有的属性如果不赋值都会默认被初始化为 nil 或者 0. 而在 Swift 中可以所有属性的值由开发者来指定.

    Swift 的编译器会对初始化的方法进行安全地检查已保证实例的初始化可以被安全正确的执行:

    1. 指定构造器必须要确保所有被类中提到的属性在代理向上调用父类的指定构造器前被初始化, 之后才能将其它构造任务代理给父类中的构造器.
    2. 指定构造器必须先向上代理调用父类中的构造器, 然后才能为任意属性赋值.
    3. 便利构造器必须先代理调用同一个类中的其他构造器, 然后再为属性赋值.
    4. 构造器在第一阶段构造完成之前, 不能调用任何实例方法, 不能读取任何实例属性的值,self 不能被引用.

    接下来我们来说明一下类构造的两个阶段:

    阶段 1

    • 某个指定构造器或便利构造器被调用.
    • 完成新的实例内存的分配, 但此时内存还没有被初始化.
    • 指定构造器确保其所在类引入的所有存储型属性都已赋值. 存储型属性所属的内存完成初始化.
    • 指定构造器将调用父类的构造器, 完成父类属性的初始化.
    • 这个调用父类构造器的过程沿着构造器链一直往上执行, 直到到达构造器链的最顶部.
    • 当到达了构造器链最顶部, 且已确保所有实例包含的存储型属性都已经赋值,这个实例的内存被认为已经完全初始化。此时 阶段 1 完成.

    1. 子类的便利构造器首先会被调用, 这时便利构造器无法修改子类的任何属性.
    2. 便利构造器会调用子类中的指定构造器, 指定构造器(子类)要确保所有的属性都已赋值, 完成所属内存的初始化,
    3. 接着会指定构造器(子类)会调用父类中的指定构造器, 完成父类属性所属内存的初始化, 直到达到构造器链的最顶部. 所有的属性以及内存被完全初始化, 然后进入第 阶段 2.

    阶段 2

    • 从顶部构造器链一直向下, 每个构造器链中类的指定构造器都有机会进一步定制实例. 构造器此时可以访问 self, 修改它的属性并调用实例方法等等。
    • 最终, 任意构造器链中的便利构造器可以有机会定制实例和使用 self

    1. 父类中的指定构造器定制实例的属性(可能).
    2. 子类中的指定构造器定制实例的属性.
    3. 子类中的便利构造器定制实例的属性.

    init 的继承和重载

    Unlike subclasses in Objective-C, Swift subclasses do not inherit their superclass initializers by default. Swift’s approach prevents a situation in which a simple initializer from a superclass is inherited by a more specialized subclass and is used to create a new instance of the subclass that is not fully or correctly initialized.

    跟 ObjC 不同, Swift 中的子类默认不会继承来自父类的所有构造器. 这样可以防止错误的继承并使用父类的构造器生成错误的实例(可能导致子类中的属性没有被赋值而正确初始化). 与方法不同的一点是, 在重载构造器的时候, 你不需要添加 override 关键字.

    虽然子类不会默认继承来自父类的构造器, 但是我们也可以通过别的方法来自动继承来自父类的构造器, 构造器的继承就遵循以下的规则:

    1. 如果子类没有定义任何的指定构造器, 那么会默认继承所有来自父类的指定构造器.
    2. 如果子类提供了所有父类指定构造器的实现, 不管是通过 规则 1 继承过来的, 还是通过自定义实现的, 它将自动继承所有父类的便利构造器.

    错误分析

    我们到目前为止已经基本介绍了所有的构造器使用的注意事项, 接下来我们分析一下最开始错误的原因.

    错误 1

    第一个错误是因为, 我们一开始虽然没有为指定构造器提供实现, 不过, 因为重载了指定构造器, 所以来自父类的指定构造器并不会被继承.

    如果子类没有定义任何的指定构造器, 那么会默认继承所有来自父类的指定构造器.

    而 init(coder aDecoder: NSCoder) 方法是来自父类的指定构造器, 因为这个构造器是 required, 必须要实现. 但是因为我们已经重载了 init(), 定义了一个指定构造器, 所以这个方法不会被继承, 要手动覆写, 这就是第一个错误的原因.

    错误 2

    class TableViewCell: UITableViewCell {
    
        init() {
    
        }
    
        required init(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    
    }
    

    我们已经手动覆写了这个方法, 然后, 因为 init() 方法虽然被重载了, 但是并没有调用父类的指定构造器:

    指定构造器必须调用它最近父类的指定构造器.

    所以我们让这个指定构造器调用 super.init(style: UITableViewCellStyle, reuseIdentifier: String?), 解决了这个问题.

    class TableViewCell: UITableViewCell {
    
        init() {
            super.init(style: .Default, reuseIdentifier: nil)
        }
    
        required init(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    
    }
    

    错误 3

    class TableViewCell: UITableViewCell {
    
        convenience init() {
            super.init(style: .Default, reuseIdentifier: nil)
        }
    
        required init(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    
    }
    

    错误 3 跟前面的两个错误没有直接的联系. 这里的构造器是一个便利构造器(注意前面的 convenience 关键字), 而这里的错误违反了这一条规则:

    便利构造器必须调用同一个类中定义的其它构造器(指定或便利).

    所以我们让这个便利构造器调用同一个类的 self.init(style: UITableViewCellStyle, reuseIdentifier: String?) 的指定构造器.

    class TableViewCell: UITableViewCell {
    
        convenience init() {
            self.init(style: .Default, reuseIdentifier: nil)
        }
    
        required init(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    
    }
    

    而这段代码目前还是有问题的, 而这就是 错误 4 的代码.

    错误 4

    错误 4 的主要原因就是重载了父类的 init(coder aDecoder: NSCoder) 指定构造器, 导致父类的指定构造器 init(style: .Default, reuseIdentifier: nil) 并没有被当前类 TableViewCell 继承, 所以当前类中是没有 init(style: .Default, reuseIdentifier: nil) 指定构造器.

    如果子类没有定义任何的指定构造器, 那么会默认继承所有来自父类的指定构造器.

    class TableViewCell: UITableViewCell {
    
        convenience init() {
            self.init(style: .Default, reuseIdentifier: nil)
        }
    }
    

    只需要删掉这个 init(coder aDecoder: NSCoder) 方法就可以解决这个错误了.

    错误 5

    class TableViewCell: UITableViewCell {
    
        let label : UILabel
    
        init(imageName: String) {
            super.init(style: .Default, reuseIdentifier: nil)
        }
    
        required init(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    
    }
    

    错误 5 的主要原因是违反了这一条规则, 它在调用 super.init(style: .Default, reuseIdentifier: nil) 之前并没有初始化自己的所有属性.

    指定构造器必须要确保所有被类中提到的属性在代理向上调用父类的指定构造器前被初始化, 之后才能将其它构造任务代理给父类中的构造器.

    因为 label 属性不是 optional 的, 所以这个属性就必须初始化.

    init(imageName: String) {  
        self.label = UILabel()
        super.init(style: .Default, reuseIdentifier: nil)
    }
    

    这是第一个解决的办法, 不过我一般使用另一种, 在属性定义的时候就为他说初始化一个值.

    class TableViewCell: UITableViewCell {
    
        let label = UILabel()
    
        init(imageName: String) {
            super.init(style: .Default, reuseIdentifier: nil)
        }
    
        required init(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
    
    }
    

    这些就是我在使用 swift 的构造其中遇到的全部错误了.

    总结

    Swift 中构造器需要遵循的规则还是很多的, 总结一下, 有以下规则:

    • 调用相关
      • 指定构造器必须调用它直接父类的指定构造器方法.
      • 便利构造器必须调用同一个类中定义的其它初始化方法.
      • 便利构造器在最后必须调用一个指定构造器.
    • 属性相关
      • 指定构造器必须要确保所有被类中提到的属性在代理向上调用父类的指定构造器前被初始化, 之后才能将其它构造任务代理给父类中的构造器.
      • 指定构造器必须先向上代理调用父类中的构造器, 然后才能为任意属性赋值.
      • 便利构造器必须先代理调用同一个类中的其他构造器, 然后再为属性赋值.
      • 构造器在第一阶段构造完成之前, 不能调用任何实例方法, 不能读取任何实例属性的值,self 不能被引用.
    • 继承相关
      • 如果子类没有定义任何的指定构造器, 那么会默认继承所有来自父类的指定构造器.
      • 如果子类提供了所有父类指定构造器的实现, 不管是通过上一条规则继承过来的, 还是通过自定义实现的, 它将自动继承所有父类的便利构造器.

    Swift 中的构造器 init 中坑还是很多的, 而目前我也终于把这个构造器这个坑填上了, 最终决定还是要重新详细看一遍 Swift 的官方文档, 而整篇博客和问题的解决都是基于官方文档的. 使用下来 Swift 比 Objective-C 语言使用起来的注意事项和坑更多, 也有很多的黑魔法, 等待着我们去开发和探索.

    展开全文
  • 首先我们在mvc的view文件夹里面定义一个MyCell, 继承UITableViewCell, 选择的语言是Swift   然后就可以在控制器里面是使用了, 以下是代码这里我们的控制器: class MineViewController: ...

    首先我们在mvc的view文件夹里面定义一个MyCell,

    继承UITableViewCell,

    选择的语言是Swift

     

    然后就可以在控制器里面是使用了,

    以下是代码这里我们的控制器:

    class MineViewController: UITableViewController{
    
        .....
    
         override func viewDidLoad() {
            super.viewDidLoad()
        
            //这里就是我们要注册的自定义Cell
            tableView.register(UINib(nibName: String(describing:MyCell.self), bundle: nil), forCellReuseIdentifier: String(describing:MyCell.self))
    
        }
        .....
    }

    注册完之后我们就可以替换系统的方法了,代码如下

     

    class MineViewController: UITableViewController{
    
        .....
    
        //返回cell的主要方法。
        override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
    
            //这里是我们主要的方法dequeueReusableCell,用来使用cell
            let cell = tableView.dequeueReusableCell(withIdentifier: String(describing:MyCell.self)) as! MyCell
    
            //这里可以不要看,这里是数据的获取
            let section = sections[indexPath.section]
            let myCellModel = section[indexPath.row]
    
            //这里的leftLabel是我们在xib里面的label,也是我们自定义的
            cell.leftLabel.text = myCellModel.text
    
            //这里的rightLabel是我们在xib里面的label,也是我们自定义的
            cell.rightLabel.text = myCellModel.grey_text
    
    
            //返回一个自定义cell
    
            return cell
    
    
        }
        .....
    }

     

     

    接下来介绍的是简化cell调用,操作步骤如下

    1,在我们的主要文件夹里面新建一个UIView+Extension.swift 

    
    import UIKit
    
    protocol RegisterCellOrNib {}
    
    
    extension RegisterCellOrNib{
        static var identifier:String{
            return "\(self)"
        }
        
        static var nib:UINib?{
            return UINib(nibName: "\(self)", bundle: nil)
        }
        
    }
    

    2,在同级目录下新建一个UITableView+Extension.swift ,这里拓展的是UITableView

    import UIKit
    
    extension UITableView{
    
        //这里是注册
        func fp_registerCell<T:UITableViewCell>(cell:T.Type) where T:RegisterCellOrNib {
            if let nib = T.nib {
                register(nib, forCellReuseIdentifier: T.identifier)
            }else{
                register(cell, forCellReuseIdentifier: T.identifier)
            }
        }
        
        //这里是调用得到cell
        func fp_dequeueReusableCell<T:UITableViewCell>(indexPath:IndexPath) -> T where T:RegisterCellOrNib {
            return dequeueReusableCell(withIdentifier: T.identifier,for: indexPath)as! T
        }
    }
    
    

     

    就两步,不复杂。

     

    接下来是替换。

    class MineViewController: UITableViewController{
    
        .....
    
         override func viewDidLoad() {
            super.viewDidLoad()
        
    
            //这里就是我们要注册的自定义Cell
            tableView.register(UINib(nibName: String(describing:MyCell.self), bundle: nil), forCellReuseIdentifier: String(describing:MyCell.self))
    
    
            //以上的代码替换成下面的
            tableView.fp_registerCell(cell: MyCell.self)
    
        }
    }

     

    使用的时候也替换一下

     

    class MineViewController: UITableViewController{
    
        .....
    
        //返回cell的主要方法。
        override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
    
    
    
    
            //这里是我们主要的方法dequeueReusableCell,用来使用cell
            //let cell = tableView.dequeueReusableCell(withIdentifier: String(describing:MyCell.self)) as! MyCell
    
            //以上的代码替换成下面的
            let cell = tableView.fp_dequeueReusableCell(indexPath: indexPath) as MyCell
    
    
            ......
            return cell
    
    
        }
        .....
    }
     

     

    这篇就结束了,总结一点,就是自定义cell的使用实战。

     

     

     

     

     

     

    展开全文
  • 使用纯代码创建任意自定义的UITableViewCell使用纯代码创建UITableView并调用UITableViewCell 步骤 创建一个UITableViewCell(并创建xib)命名为 DemoListCell 创建Cell 1) 在DemoListCell.xib中画出你...

    学习目标:

    • 使用纯代码创建任意自定义的UITableViewCell
    • 使用纯代码创建UITableView并调用UITableViewCell

    步骤

    1. 创建一个UITableViewCell(并创建xib)命名为 DemoListCell

    创建Cell


    1) 在DemoListCell.xib中画出你想要的cell样式(AutoLayout),另外注意要给Cell制定 IdentityId: DemoListID


    设置CellId


    2) 我这里创建了两个UIImage,一个UILabel (图片我会后续补上)


    创建布局控件

    3) 从UIDemoListCell.xib 向 UIDemoListCell.swift 划线(右键选择控件不放拖到.swift文件中放手并命名),Cell样式的初始化就完成了,接下来我们需要调用。代码如下:

    swift
    @IBOutlet weak var cellImg: UIImageView!
    @IBOutlet weak var cellLabel: UILabel!
    @IBOutlet weak var cellIcon: UIImageView!

    注释:图片我会后续补上去

    1. 调用自定义的UITableViewCell
      1) 创建数据源和CellId

      swift
      let cellId = "DemoListID" //获取CellId
      var tableData: (titles:[String], values:[String])? //定义一个数据源

      2) 在viewDidLoad中使用代码创建一个UITableView
      swift
      override func viewDidLoad() {
           super.viewDidLoad()
           self.title = "主页"
           self.view.backgroundColor = UIColor.whiteColor()
      
           //demoList的设置
           self.demoList.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height)
           //下面代码是用来去掉UITableView的Cell之间的线
           //self.demoList.separatorStyle = UITableViewCellSeparatorStyle.None
           let nib = UINib(nibName: "DemoListCell", bundle: nil) //nibName指的是我们创建的Cell文件名
           self.demoList.registerNib(nib, forCellReuseIdentifier: cellId)
           self.demoList.delegate = self
           self.demoList.dataSource = self
           self.view.addSubview(self.demoList)
           self.showData()
       }
    2. 展示数据源,这里我就写一个静态数据作为数据源即可
      swift
      func showData()
       {
           self.tableData = (["SLC提示组件", "SwiftNotice组件--JohnLui", "CNPPopup组件","闭包回调","KLCPopup组件","Pitaya网络组件","Neon布局组件"], ["SCLAlert", "SwiftNotice", "CNPPopup","ClosureBack","","",""])
           self.demoList.reloadData()
      }
    3. 既然使用了UITableView那么就必须要使用注意到有些必须的代理需要重写,其实我们可以去UITableView中查看,没有 optional开头的function都是必须重写
      1) 这里我们重写 这里我们重写四个,代码如下:

      swift
      func numberOfSectionsInTableView(tableView: UITableView) -> Int {
           return 1
       }
      
       func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
      
           guard let count:Int = self.tableData!.titles.count else {
               print("没有数据")
           }
      
           return count
       }
       func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
           let cell = tableView.dequeueReusableCellWithIdentifier(self.cellId, forIndexPath: indexPath) as! DemoListCell
           //cell.cellImg.image = UIImage(named: powerData[indexPath.row][2])
           cell.cellLabel.text = self.tableData!.titles[indexPath.row]
      
           return cell
       }
      
       func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
       {
           let index = indexPath.row
           let storyID = tableData!.values[index] as String
           let storyboard = UIStoryboard(name: "Main", bundle: nil)
           var nextView:UIViewController
           switch storyID {
           case "SCLAlert":
               nextView = storyboard.instantiateViewControllerWithIdentifier(storyID) as! SCLAlertDemoViewController
           case "SwiftNotice":
               nextView = storyboard.instantiateViewControllerWithIdentifier(storyID) as! SwiftNoticeDemoViewController
           case "CNPPopup":
               nextView = storyboard.instantiateViewControllerWithIdentifier(storyID) as! CNPPopupDemoViewController
           case "ClosureBack":
               nextView = LWRootViewController()
           default:
               nextView = storyboard.instantiateViewControllerWithIdentifier("SCLAlert") as! SCLAlertDemoViewController
           }
           self.navigationController?.pushViewController(nextView, animated: true)
       }
      
       func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
       {
           return 50
       }

    注意事项:

    既然创建了UITableView,需要在Class继承后面加上Delegate和DataSource

    swift
    class MainViewController: UIViewController,UITableViewDelegate,UITableViewDataSource

    总结:

    这样我们就成功创建了一个纯代码创建的UITableView以及调用了自定义的Cell,是不是很简单!
    下面就是效果图(我的GitHub


    原文链接:http://www.jianshu.com/p/150ba0779cc0

    展开全文
  • storyboard中自定义cell

    2016-04-15 10:09:52
    iOS开发中,在storyboard中实现自定义cell比在nib文件中实现要简单许多。  首先创建自己的自定义cell的类,我们叫做CustomCell,要继承于UITableViewCell。在这个类中定义自己所需要的控件。  然后,打开...

     iOS开发中,在storyboard中实现自定义cell比在nib文件中实现要简单许多。

       首先创建自己的自定义cell的类,我们叫做CustomCell,要继承于UITableViewCell。在这个类中定义自己所需要的控件。

        然后,打开storyboard,选择自己要添加自定义cell的UIViewController,我们叫它为ViewController。在UITableView里面添加一个cell(或者修改原有的cell)。将cell的style改为custom,将cell的类改为CustomCell,将identifier改为CustomCellIdentifier。然后,可以在cell中添加控件,将控件和刚才在CustomCell中定义的控件连起来。

        最后,在ViewController的UITableView的tableView:cellForRowAtIndexPath:代理方法中添加以下代码: 

    [plain]
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CustomCellIdentifier"]; 
        这样,就创建了一个cell,可以在这句代码之后对自己添加的控件进行设置。

     

    展开全文
  • 找工作依然不好找,还需努力才是 ...这个里面就是咱们定义cell时所写的代码,里面也用到复用。func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  • // // GoodFriendTableViewController.m // TeamTalk // // Copyright © 2016年 MoguIM. All rights reserved. // #import "GoodFriendTableViewController.h" #import "GoodFriendCell.h" ...@interface GoodFri
  • swigt自定义cell的时候,出现了这个错误,后来经过查找发现,swift自定一cell的时候要定义好identifier,如果不写直接在代码里面regiseter 的话就会报这样的错误,这点跟oc的好像不太一样,希望帮到遇到同样问题的...
  • Swift代码库之分页Sqlite部分代码与逻辑 Swift代码库之分页UI部分基础代码 1. 编写一个RFPages对象来管理分页 该class有两种功能: 负责存储分页相关的sql语句,每页数量,行数,页数 负责读取下一页,并返回结果 ...
  • swift中没有了宏定义这个概念,所以在获取屏幕宽高时,可以设置其为常量  let SRC_WIDTH = UIScreen.mainScreen().bounds.width  let SRC_HEIGHT = UIScreen.mainScreen().bounds.height swfit创建UITableView...
  • storyboad的拖拽关联给我们开发带来了很大的便利,但是在目前的很多公司进行IOS开发时是禁止员工使用storyboard的,纯代码的实现方式仍然是主流,对于Swift这样一门新兴语言,加强语言的使用,使用纯代码来实现,...
  • 代码创建UITableview; 2.cell的样式、点击事件,cell的重用等; 3.页面的下拉刷新、上拉加载; 4.自定义cell。由于内容过多,分成多篇来介绍。本文主要介绍创建UITableview、cell的样式、cell的重用、cell的...
  • swift tablecell 单选多选

    2019-08-04 14:10:05
    之前做过单选多选题的处理,现在把当时遇到的问题和解决...刚开始的时候,定义var selectedIds = [String]() //存储选中的id // if self.questionnaire?.type == "radio" {// selectedIds = []// selectedIds.append(...
  • cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
  • 一 总体实现功能图(由于csdn上传的视频有规定大小,这里只简短的录了点,抱歉)1 图一 : 系统自带属性完成动画翻转2 图二 : 自定义动画实现翻转3 应用图标;启动图片;app名字…这些我就不一 一介绍了,你们都应该知道怎么...
  • 系统提供的UITableViewCell很难满足我们的需求,自定义cell是常有的事,所以简单使用table后写了个自定义cell,具体如下: 1、创建自定义cell,继承UITableViewCell,开发语言选择swift,如下图所示: 2、定义...
  • Swift闭包详解

    2016-04-13 15:41:28
    大家注意哦,由于swift的更新,参考网址里的代码已经不能跑起来了,我结合自己的理解整理如下。 在Swift函数章节中介绍的全局和嵌套函数实际上也是特殊的闭包,闭包采取如下三种形式之一: 全局函数是一个有名字但...
  • Swift2.0中引入了协议扩展的特性,并且建议开发者一切从协议(Protocol)出发,经过几个月的学习探索,博主发现Swift作为一门面向协议编程(POP)的语言非常适合时下火热的MVVM架构。MVVM已经提出有一段时间了,如果...
  • Swift 3.0 以来,语言已经比较成熟,用Swift语言来开发iOS App 的开发者越来越多,那么一份权威而全面的规范就很有必要了。苹果官方的文档一般都很少去看,笔者参考官方文档和各路大神的经验,写下了一份基于Swift...
  • 主要学习与运行效果 在本节的内容中,我们将通过一个具体实例的实现过程,详细讲解在表视图当中,如何创建一个可展开可收缩的表视图。为了让读者有着更为直观的印象,我们将通过模仿QQ好友列表来实现这个效果。...
1 2 3 4 5 ... 20
收藏数 2,418
精华内容 967