Ios 为什么不';我们使用xib创建customTableViewCell的过程是否与使用xib创建customView的过程相同?
在创建customView时,我们将视图文件的所有者设置为custom类,并使用initWithFrame或initWithCode对其进行实例化。 当我们创建customUITableViewCell时,我们将视图的类设置为custom类,而不是文件的所有者。然后注册所有笔尖,依此类推。 通过这种方式,我们始终需要将XIB注册到UIViewController和Ios 为什么不';我们使用xib创建customTableViewCell的过程是否与使用xib创建customView的过程相同?,ios,swift,Ios,Swift,在创建customView时,我们将视图文件的所有者设置为custom类,并使用initWithFrame或initWithCode对其进行实例化。 当我们创建customUITableViewCell时,我们将视图的类设置为custom类,而不是文件的所有者。然后注册所有笔尖,依此类推。 通过这种方式,我们始终需要将XIB注册到UIViewController和 let cell=tableView.dequeueReusableCellWithIdentifier(“reuseIdentif
let cell=tableView.dequeueReusableCellWithIdentifier(“reuseIdentifier”,forIndexPath:indexPath)
依此类推
我发现我不想一直在使用customUITableViewCell的地方注册NIB。所以我想在customUITableCell中初始化xib,就像创建customUIView的过程一样。我成功了。以下是步骤
我的问题是,创建customUITableCell的首选方法是什么?
使用此方法无需注册nib,我们可以在不加载/注册nib的情况下调用customCell。
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
}
}
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