Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么不';我们使用xib创建customTableViewCell的过程是否与使用xib创建customView的过程相同?_Ios_Swift - Fatal编程技术网

Ios 为什么不';我们使用xib创建customTableViewCell的过程是否与使用xib创建customView的过程相同?

Ios 为什么不';我们使用xib创建customTableViewCell的过程是否与使用xib创建customView的过程相同?,ios,swift,Ios,Swift,在创建customView时,我们将视图文件的所有者设置为custom类,并使用initWithFrame或initWithCode对其进行实例化。 当我们创建customUITableViewCell时,我们将视图的类设置为custom类,而不是文件的所有者。然后注册所有笔尖,依此类推。 通过这种方式,我们始终需要将XIB注册到UIViewController和 let cell=tableView.dequeueReusableCellWithIdentifier(“reuseIdentif

在创建customView时,我们将视图文件的所有者设置为custom类,并使用initWithFrame或initWithCode对其进行实例化。

当我们创建customUITableViewCell时,我们将视图的类设置为custom类,而不是文件的所有者。然后注册所有笔尖,依此类推。 通过这种方式,我们始终需要将XIB注册到UIViewController和

let cell=tableView.dequeueReusableCellWithIdentifier(“reuseIdentifier”,forIndexPath:indexPath)
依此类推

我发现我不想一直在使用customUITableViewCell的地方注册NIB。所以我想在customUITableCell中初始化xib,就像创建customUIView的过程一样。我成功了。以下是步骤

我的问题是,创建customUITableCell的首选方法是什么? 使用此方法无需注册nib,我们可以在不加载/注册nib的情况下调用customCell。

  • 将视图文件的xib所有者设置为customUITableCell类。不是视图的类设置为customClass,而是文件的所有者
  • 我的自定义类名为myView:UITableViewCell

    import UIKit
    
    class myView: UITableViewCell {
    
        var subView: UIView!
    
    
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
            initSubviews()
        }
    
        override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
            super.init(style: style, reuseIdentifier: reuseIdentifier)
    
            initSubviews()
        }
    
        func initSubviews(){
            subView = Bundle.main.loadNibNamed("TableViewCell", owner: self, options: nil)?.first as! UIView
    
            subView.autoresizingMask = UIViewAutoresizing(rawValue:  UIViewAutoresizing.RawValue(UInt8(UIViewAutoresizing.flexibleWidth.rawValue) |  UInt8(UIViewAutoresizing.flexibleHeight.rawValue)))
            self.addSubview(subView)
    
        }
    }
    
    class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    
    
    
    var tableStyle: UITableView = UITableView()
    
            override func viewDidLoad() {
                super.viewDidLoad()
    
                tableStyle.frame = CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: self.view.frame.size.height)
                tableStyle.delegate = self
                tableStyle.dataSource = self
                view.addSubview(tableStyle)
            }
    
    
            func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
                return 100.00
            }
            func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
                return 1        }
    
            func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
               let cell = myView(style: .default , reuseIdentifier: "TableViewCell")
    
                return cell
            }
        }
    
  • İnside UIVivController,我没有注册NIB并使用

  • let cell=tableView.dequeueReusableCellWithIdentifier(“reuseIdentifier”,forIndexPath:indexPath)

    相反,我这样做了

    let cell=myView(样式:。默认值,reuseIdentifier:“TableViewCell”)

  • 结果如下

  • 谢谢你的时间

    您的方法意味着每当
    UITableView
    请求一个新单元时,您都在从头开始创建一个全新的单元。这意味着它必须:

  • 找到笔尖
  • 加载笔尖
  • 解析它以查找视图
  • 发表意见
  • 更新单元格
  • 这并不比拥有一个长滚动视图和整个长度的自定义视图更好

    UITableView
    的美妙之处在于,它优化了这一过程的大部分内容,并重新使用了单元格,从而大大降低了在屏幕上放置过多单元格的性能成本使用传统(正确)方法,步骤1-4只需执行一次

    要扩展xib中的差异,请执行以下操作:

    使用
    UITableView
    创建单元格时,您只给它nib,系统会在nib中查找
    UITableView单元格
    。简单的
    ui视图
    不起作用


    实际上,您可以使用自定义类对
    xib
    中的
    UIView
    进行子类化。碰巧的是,规范是使用
    fileOwner
    ,这主要是因为在故事板之前的时代,当NIB与
    UIViewControllers
    一起使用时,这是规范。您的方法意味着每次
    UITableView
    请求一个新单元时,您都在从头开始创建一个全新的单元。这意味着它必须:

  • 找到笔尖
  • 加载笔尖
  • 解析它以查找视图
  • 发表意见
  • 更新单元格
  • 这并不比拥有一个长滚动视图和整个长度的自定义视图更好

    UITableView
    的美妙之处在于,它优化了这一过程的大部分内容,并重新使用了单元格,从而大大降低了在屏幕上放置过多单元格的性能成本使用传统(正确)方法,步骤1-4只需执行一次

    要扩展xib中的差异,请执行以下操作:

    使用
    UITableView
    创建单元格时,您只给它nib,系统会在nib中查找
    UITableView单元格
    。简单的
    ui视图
    不起作用


    实际上,您可以使用自定义类对
    xib
    中的
    UIView
    进行子类化。碰巧的是,规范是使用
    fileOwner
    ,这主要是因为这是使用带有
    UIViewControllers
    的NIB时的规范,正如故事板时代之前所要求的那样,这是对公认答案的补充:

    如果“经典”方法的唯一问题是需要注册nib并调用
    dequeueReusableCell
    ,则可以使用一个漂亮的协议扩展简化调用,如中所述:

    你只要打电话登记就行了

    self.tableView.register(UINib(nibName: MyTableViewCell.reuseIdentifier, bundle: nil), forCellReuseIdentifier: MyTableViewCell. reuseIdentifier)
    
    要创建它,您可以调用

    let cell = self.tableView.dequeueReusableCell(withIdentifier: MyTableViewCell. reuseIdentifier, for: indexPath) as! MyTableViewCell
    

    (当然,只有当类、xib和重用标识符都具有相同的名称时,这才有效)

    接受答案的补充:

    如果“经典”方法的唯一问题是需要注册nib并调用
    dequeueReusableCell
    ,则可以使用一个漂亮的协议扩展简化调用,如中所述:

    你只要打电话登记就行了

    self.tableView.register(UINib(nibName: MyTableViewCell.reuseIdentifier, bundle: nil), forCellReuseIdentifier: MyTableViewCell. reuseIdentifier)
    
    要创建它,您可以调用

    let cell = self.tableView.dequeueReusableCell(withIdentifier: MyTableViewCell. reuseIdentifier, for: indexPath) as! MyTableViewCell
    

    (当然,这只适用于类、xib和重用标识符都具有相同名称的情况)

    只是一个提示:如果您有代码,请发布代码。不要发布它的截图。只是一个提示:如果你有代码,就发布代码。不要发布它的截图。谢谢。我现在明白了,谢谢。我现在明白了,谢谢。事实上,我对经典方法没有问题。我只是对创建自定义UIView感到困惑。因为我们将文件的所有者设置为类。不将视图的类转换为自定义类。但在这里,我们将视图的类设置为自定义类,并且在这里也不使用initWithCoder或initSomething进行初始化。(这里指的是经典方法)这个扩展的一个很好的扩展是使用一个名为的小库。很有趣,谢谢你的链接。我尝试使用尽可能少的框架,特别是如果我能用几行代码解决问题的话。但是我会试试的。谢谢。事实上,我对经典方法没有问题。我只是对创建自定义UIView感到困惑。因为我们将文件的所有者设置为类。不将视图的类转换为自定义类。但这里我们将view的类设置为custom