gpt4 book ai didi

ios - tableView.dequeueReusableCellWithIdentifier VS tableView.cellForRowAtIndexPath

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:59:16 27 4
gpt4 key购买 nike

我的 Xcode 是 7.1。模拟器是iPhone6。
通常我使用dequeueResuableCellWithIdentifier,但是这次我遇到了问题。

我的问题是:
选择新行后,它不会清除我的 orangeColor()。但是取消选择 indexPath 的打印行是正确的。

我的解决方案是:
我从
let cell = tableView.dequeueReusableCellWithIdentifier("MyCell", forIndexPath: indexPath) 更改为! MyCell;

让 cell = tableView.cellForRowAtIndexPath(indexPath) 作为! MyCell;
然后它解决了我的问题。背景颜色是 clearColor()

这是我的文件:
我的细胞.swift:

import UIKit

class MyCell: UITableViewCell {
@IBOutlet weak var myLabel : UILabel!
@IBOutlet weak var myWebView : UIWebView!;
//@IBOutlet weak var myView : UIView!;
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code.
}

override func setSelected(selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)

// Configure the view for the selected state
}

}

ViewController.swift :

import UIKit

class ViewController: UIViewController,UITableViewDelegate, UITableViewDataSource {

@IBOutlet weak var tableViewObject: UITableView!

var fruits = ["Apple", "Banana","Cherry", "Durian", "ElderBerry"];
var selectedIndexPath : NSIndexPath?;
override func viewDidLoad() {
super.viewDidLoad()
self.tableViewObject.delegate = self;
self.tableViewObject.dataSource = self;
// Do any additional setup after loading the view, typically from a nib.
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
return fruits.count;
}
func loadCellContent(acell : UITableViewCell, indexPath : NSIndexPath, color: UIColor){
let cell = acell as! MyCell;
cell.myLabel.text = String(UnicodeScalar(65 + indexPath.row));
cell.myWebView.loadHTMLString(fruits[indexPath.row], baseURL: nil);
cell.myWebView.scrollView.bounces = false;
cell.myWebView.scrollView.scrollEnabled = false;
cell.myWebView.userInteractionEnabled = false;
cell.backgroundColor = color;
cell.myLabel.backgroundColor = color;
cell.myWebView.backgroundColor = color;
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
let cell = tableView.dequeueReusableCellWithIdentifier("MyCell", forIndexPath: indexPath) as! MyCell;
self.loadCellContent(cell, indexPath: indexPath, color: UIColor.clearColor());
return cell;
}

func numberOfSectionsInTableView(tableView: UITableView) -> Int{
return 1;
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
//let cell = tableView.dequeueReusableCellWithIdentifier("MyCell", forIndexPath: indexPath) as! MyCell;
let cell = tableView.cellForRowAtIndexPath(indexPath) as! MyCell;
self.loadCellContent(cell, indexPath: indexPath, color : UIColor.orangeColor());
}
func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
//let cell = tableView.dequeueReusableCellWithIdentifier("MyCell", forIndexPath: indexPath) as! MyCell;
let cell = tableView.cellForRowAtIndexPath(indexPath) as! MyCell;
self.loadCellContent(cell, indexPath: indexPath,color: UIColor.clearColor());
print("Hellos", indexPath.row);

}
}

我的问题是:
1. dequeueReusableCellWithIdentifer 方法和cellForRowAtIndexPath 方法的主要区别是什么?
2. 何时使用第一个或第二个,我怎么知道?这次我使用从一个教程到另一个教程的试错法。

更新:
我的背景是物理学和一点点计算机科学。请不要对我幼稚的问题生气等等。

最佳答案

tableview 尝试在内存中始终不包含所有索引路径的单元格对象实例:

  • 'dequeueReusableCellWithIdentifer' 回收或创建一个单元格,应该在 'cellForRow...' 中调用。这总是返回一个单元格实例,一个新的或以前不再可见的单元格实例。之后准备要显示的单元格。

  • 'cellForRowAtIndexPath(indexPath: NSIndexPath) -> UITableViewCell?//如果 单元格不可见或索引路径超出范围,则返回 nil' 这不会创建单元格,只允许您访问它们。我认为应该尽可能避免,以防止意外泄漏和其他对 tableView 的干扰。

关于您的“setSelected”问题:

  • 在单元类中实现重用准备(将所有值设置为默认值)是个好主意。
  • 您不需要在“didSelectRow”中再次加载单元格内容(用户刚刚点击它,所以它被加载)
  • 您可能需要在单元格的“setSelected”中在橙色/透明颜色之间切换

关于ios - tableView.dequeueReusableCellWithIdentifier VS tableView.cellForRowAtIndexPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33559932/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com