在 TableView 中滚动时重复值
Values Repeat When Scrolling in TableView
当我点击自定义单元格中的一个按钮然后向下(或向上)滚动时,也会点击另一个单元格按钮。我看到它被点击了,因为我为按钮创建的按钮插座被禁用了。
我的 cellForRowAtIndexPath
有一个单元格的 reuseIdentifier:
var cell: FeedTableViewCell? = tableView.dequeueReusableCellWithIdentifier("MusicCell") as? FeedTableViewCell
考虑到我在 cellForRowAtIndexPath
中有 degueueReusableCellWithId
,我需要 prepareForReuse
吗?当我在我的自定义单元格文件中添加 prepareForReuse
时,该单元格将恢复为默认值(显然是因为我将其重置为默认值)。问题是我希望它保留每个 indexPath.row.
的值
这就是我查询值的方式:
override func queryForTable() -> PFQuery {
var query:PFQuery = PFQuery(className:"Music")
if(objects?.count == 0)
{
query.cachePolicy = PFCachePolicy.CacheThenNetwork
}
query.orderByAscending("videoId")
return query
}
这是numberOfRowsInSection
和cellForRowAtIndexPath
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return objects!.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath, object: PFObject?) -> PFTableViewCell? {
var cell: FeedTableViewCell? = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as? FeedTableViewCell
if(cell == nil) {
cell = NSBundle.mainBundle().loadNibNamed("FeedTableViewCell", owner: self, options: nil)[0] as? FeedTableViewCell
}
if let pfObject = object {
//I took out the irrelevant methods. I can add them if that makes a difference...
var votes:Int? = pfObject["votes"] as? Int
if votes == nil {
votes = 0
}
cell?.votesLabel?.text = "\(votes!)"
}
我正在 super.viewDidLoad()
上方的 viewDidLoad
中注册
tableView.registerNib(UINib(nibName: "FeedTableViewCell", bundle: nil), forCellReuseIdentifier: cellIdentifier)
这是我在 customCell 中的按钮查询:
@IBAction func heartButton(sender: AnyObject) {
if(parseObject != nil) {
if var votes:Int? = parseObject!.objectForKey("votes") as? Int {
votes!++
parseObject!.setObject(votes!, forKey: "votes")
parseObject!.saveInBackground()
votesLabel?.text = "\(votes!)"
}
}
heartOutlet.enabled = false
}
任何帮助和建议都意义重大。
谢谢。
我使用的参考链接:
我提到了几个链接,但它们在 objective-c 中并且没有帮助:
UICollectionView Tap Selects More Than One Cell
How to use prepareForReuse method
我也参考了文档,但没有太大帮助。
根据您发布的代码,很明显您没有针对 DataSource
(数组及其用于加载表视图的对象,即 objects
数组中的元素)。无论数组包含什么对象,添加一个 属性 来确定按钮的条件是真还是假,然后在 cellForRowAtIndexPath
中根据它设置按钮的启用 属性。单击按钮时,向 ViewController 添加回调(使用委托)并在那里设置 属性。
示例代码
在自定义单元格中 class:
protocol CellButtonDelegate
{
func buttonClicked(cell : PFTableViewCell)
}
public var delegate : CellButtonDelegate?
public var buttonEnabled : Bool?
{
get
{
return heartOutlet.enabled
}
set
{
heartOutlet.enabled = newValue
}
}
@IBAction func heartButton(sender: AnyObject) {
if(parseObject != nil) {
if var votes:Int? = parseObject!.objectForKey("votes") as? Int {
votes!++
parseObject!.setObject(votes!, forKey: "votes")
parseObject!.saveInBackground()
votesLabel?.text = "\(votes!)"
}
}
delegate?.buttonClicked(self)
}
在ViewController中:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath, object: PFObject?) -> PFTableViewCell? {
var cell: FeedTableViewCell? = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as? FeedTableViewCell
if(cell == nil) {
cell = NSBundle.mainBundle().loadNibNamed("FeedTableViewCell", owner: self, options: nil)[0] as? FeedTableViewCell
}
if let pfObject = object {
//I took out the irrelevant methods. I can add them if that makes a difference...
var votes:Int? = pfObject["votes"] as? Int
if votes == nil {
votes = 0
}
cell?.buttonEnabled = objects[indexPath.row].isEnabled //The new property you need to add. true by default
cell?.delegate = self //Make sure you implement the delgate
cell?.votesLabel?.text = "\(votes!)"
return cell?
}
func buttonClicked(cell : PFTableViewCell)
{
//Here, get the indexPath using the cell and assign the new property in the array.
}
请注意上面的代码是粗略的。只需从代码中获取想法并根据您的要求实现它。
当我点击自定义单元格中的一个按钮然后向下(或向上)滚动时,也会点击另一个单元格按钮。我看到它被点击了,因为我为按钮创建的按钮插座被禁用了。
我的 cellForRowAtIndexPath
有一个单元格的 reuseIdentifier:
var cell: FeedTableViewCell? = tableView.dequeueReusableCellWithIdentifier("MusicCell") as? FeedTableViewCell
考虑到我在 cellForRowAtIndexPath
中有 degueueReusableCellWithId
,我需要 prepareForReuse
吗?当我在我的自定义单元格文件中添加 prepareForReuse
时,该单元格将恢复为默认值(显然是因为我将其重置为默认值)。问题是我希望它保留每个 indexPath.row.
这就是我查询值的方式:
override func queryForTable() -> PFQuery {
var query:PFQuery = PFQuery(className:"Music")
if(objects?.count == 0)
{
query.cachePolicy = PFCachePolicy.CacheThenNetwork
}
query.orderByAscending("videoId")
return query
}
这是numberOfRowsInSection
和cellForRowAtIndexPath
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return objects!.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath, object: PFObject?) -> PFTableViewCell? {
var cell: FeedTableViewCell? = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as? FeedTableViewCell
if(cell == nil) {
cell = NSBundle.mainBundle().loadNibNamed("FeedTableViewCell", owner: self, options: nil)[0] as? FeedTableViewCell
}
if let pfObject = object {
//I took out the irrelevant methods. I can add them if that makes a difference...
var votes:Int? = pfObject["votes"] as? Int
if votes == nil {
votes = 0
}
cell?.votesLabel?.text = "\(votes!)"
}
我正在 super.viewDidLoad()
上方的viewDidLoad
中注册
tableView.registerNib(UINib(nibName: "FeedTableViewCell", bundle: nil), forCellReuseIdentifier: cellIdentifier)
这是我在 customCell 中的按钮查询:
@IBAction func heartButton(sender: AnyObject) {
if(parseObject != nil) {
if var votes:Int? = parseObject!.objectForKey("votes") as? Int {
votes!++
parseObject!.setObject(votes!, forKey: "votes")
parseObject!.saveInBackground()
votesLabel?.text = "\(votes!)"
}
}
heartOutlet.enabled = false
}
任何帮助和建议都意义重大。
谢谢。
我使用的参考链接:
我提到了几个链接,但它们在 objective-c 中并且没有帮助:
UICollectionView Tap Selects More Than One Cell
How to use prepareForReuse method
我也参考了文档,但没有太大帮助。
根据您发布的代码,很明显您没有针对 DataSource
(数组及其用于加载表视图的对象,即 objects
数组中的元素)。无论数组包含什么对象,添加一个 属性 来确定按钮的条件是真还是假,然后在 cellForRowAtIndexPath
中根据它设置按钮的启用 属性。单击按钮时,向 ViewController 添加回调(使用委托)并在那里设置 属性。
示例代码
在自定义单元格中 class:
protocol CellButtonDelegate
{
func buttonClicked(cell : PFTableViewCell)
}
public var delegate : CellButtonDelegate?
public var buttonEnabled : Bool?
{
get
{
return heartOutlet.enabled
}
set
{
heartOutlet.enabled = newValue
}
}
@IBAction func heartButton(sender: AnyObject) {
if(parseObject != nil) {
if var votes:Int? = parseObject!.objectForKey("votes") as? Int {
votes!++
parseObject!.setObject(votes!, forKey: "votes")
parseObject!.saveInBackground()
votesLabel?.text = "\(votes!)"
}
}
delegate?.buttonClicked(self)
}
在ViewController中:
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath, object: PFObject?) -> PFTableViewCell? {
var cell: FeedTableViewCell? = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as? FeedTableViewCell
if(cell == nil) {
cell = NSBundle.mainBundle().loadNibNamed("FeedTableViewCell", owner: self, options: nil)[0] as? FeedTableViewCell
}
if let pfObject = object {
//I took out the irrelevant methods. I can add them if that makes a difference...
var votes:Int? = pfObject["votes"] as? Int
if votes == nil {
votes = 0
}
cell?.buttonEnabled = objects[indexPath.row].isEnabled //The new property you need to add. true by default
cell?.delegate = self //Make sure you implement the delgate
cell?.votesLabel?.text = "\(votes!)"
return cell?
}
func buttonClicked(cell : PFTableViewCell)
{
//Here, get the indexPath using the cell and assign the new property in the array.
}
请注意上面的代码是粗略的。只需从代码中获取想法并根据您的要求实现它。