heightForRowAtIndexPath 被调用,但高度没有改变

Posted

技术标签:

【中文标题】heightForRowAtIndexPath 被调用,但高度没有改变【英文标题】:heightForRowAtIndexPath is called, but the height doesn't change 【发布时间】:2015-12-14 12:49:52 【问题描述】:

我有一个名为 myTableView 的 UITableView。我想让 tableView 做的事情其实很简单。如果用户点击一个单元格,它应该展开,换句话说,tableView 是手风琴。这部分对我来说很好,但我也希望当用户点击 mapView 上的标记时单元格展开(我正在使用 Mapbox)。标记的标题以数字结尾,我使用这个数字来确定应该扩展哪个单元格。因此,我从标题字符串中获取数字并创建一个以数字为行的 NSIndexPath(称为 localIndexPath)。之后,我将手动选择相应的单元格:

self.myTableView.selectRowAtIndexPath(localIndexPath, animated: true, scrollPosition: UITableViewScrollPosition.None)

然后我通过以下方式调用 didSelectRowAtIndexPath:

self.tableView(self.myTableView, didSelectRowAtIndexPath: localIndexPath)

然后调用 heightForRowAtIndexPath,这两种方式都成功调用,但实际高度仅在我单击单元格时发生变化,而不是在我单击标记时发生变化。我的问题是为什么会这样,我怎样才能让它双向工作?

所有对应方法的代码如下:

import UIKit

@IBDesignable class PullUpView: UIView, UITableViewDataSource, UITableViewDelegate 


@IBOutlet var tableCell: UIView!
@IBOutlet weak var hideButton: UIButton!
@IBOutlet weak var myTableView: UITableView!

var view:UIView!
var selectedRowIndex = NSIndexPath(forRow: 99, inSection: 0)
var localIndexPath = NSIndexPath(forRow: 99, inSection: 0)
//irrelevant code...

//This is the function I call when I click a marker
func callDidSelectRowAtIndexPathManually(clickedAnnotation: String)
    print("MANUALLY: \(clickedAnnotation)")
    var tourNumber: String = "Default"
    if(clickedAnnotation.characters.count == 18)
        let idx = advance(clickedAnnotation.startIndex, 15)
         tourNumber = String(clickedAnnotation[idx])
      //  print("TOUR NUMMER IST: \(tourNumber)")
     //in case of two digit number
    else if(clickedAnnotation.characters.count == 19)
        let idx = advance(clickedAnnotation.startIndex, 15)
        let idxTwo = advance(clickedAnnotation.startIndex, 16)
         tourNumber = String(clickedAnnotation[idx]) + String(clickedAnnotation[idxTwo])
       // print("TOUR NUMMER IST: \(tourNumber)")
    
    let tourNumberAsInt = Int(tourNumber)
    print("TOUR NUMMER IST: \(tourNumberAsInt)")
    if(tourNumberAsInt != nil)
    localIndexPath = NSIndexPath(forRow: tourNumberAsInt!, inSection: 0)
    //The manual selection and call
    self.myTableView.selectRowAtIndexPath(localIndexPath, animated: true, scrollPosition: UITableViewScrollPosition.None)
    self.tableView(self.myTableView, didSelectRowAtIndexPath: localIndexPath)
    getCellHeight(localIndexPath)
    


 //I just store the indexPath in a variable
 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    NSLog("Und gewählter Index ist:  \(indexPath.row)")
    selectedRowIndex = indexPath
    myTableView.beginUpdates()
    print("did start updates")
    myTableView.endUpdates()
    print("did end updates")
    getCellHeight(selectedRowIndex)



//I use this function to check the height of the cell
func getCellHeight(indexPath: NSIndexPath)
    var cell = tableView(myTableView, cellForRowAtIndexPath: indexPath)
    print("HÖHE VON: \(indexPath.row) ist jetzt: \(cell.bounds.height)")


//I check wheter selectedIndexPath or localIndexPath are equal to the indexPath argument, if it is the cell should expand
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 
    if(selectedRowIndex == indexPath && selectedRowIndex.row == indexPath.row || localIndexPath == indexPath)
        print("heightforrow CALLED für: \(indexPath.row)")
        return 200
   
     print("heightforrow NOT CALLED für: \(indexPath.row)")
    return 60


对不起,德语版画,但我认为你可以弥补他们的意思(ist = is,für = for,höhe von = height of)。

这是我点击第二个单元格时的日志,这工作正常,单元格按我的意图扩展,即使高度显示为 44:

did start Updates
heightforrow NOT CALLED für: 0
heightforrow CALLED für: 1
heightforrow NOT CALLED für: 2
did end updates
HÖHE VON: 1 ist jetzt: 44.0

这是我点击注释时的日志,单元格没有在视觉上扩展:

did start updates
heightforrow NOT CALLED für: 0
heightforrow NOT CALLED für: 1
heightforrow CALLED für: 2
heightforrow NOT CALLED für: 0
heightforrow NOT CALLED für: 1
heightforrow CALLED für: 2
did end updates
HÖHE VON: 2 ist jetzt: 44.0
HÖHE VON: 2 ist jetzt: 44.0

在此先感谢,并为我的英语不好感到抱歉!

【问题讨论】:

你应该在提问的时候总结你的问题。这个问题太长了,需要太多时间阅读。 问题可能出在您的localIndexPath。你是怎么计算的? 谢谢,我会试试的!这是我在这里的第一篇文章,所以我有很多东西要学习。 @kelin我得到一个看起来像Optional(“Tour 2”)的字符串,我使用advanced方法获取数字然后将其转换为Int,它看起来在日志中有效,但我会进一步研究让你知道! @NoLoHo,你使用自动布局吗? @kelin no 我禁用了自动布局,但是视图被添加为子视图,这可能与问题有关吗? localindexpath 变量是正确的。 【参考方案1】:

非常感谢所有试图帮助我解决这个问题的人!!!我尝试了一切,但我无法让它发挥作用。在研究时,我发现一种方法比我在此处发布的代码更适合我想要的东西。这就是我现在正在做的事情: https://www.youtube.com/watch?v=VWgr_wNtGPM 借助:Terminating app due to uncaught exception 'NSRangeException', reason: 'Cannot remove an observer - ios

【讨论】:

很高兴我的视频对您有所帮助。如果您有任何其他问题,请告诉我。 谢谢,如果我有问题,我会的!你的视频真的很棒,对我帮助很大!【参考方案2】:

你必须编写如下函数:

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 
    return 44.00

【讨论】:

感谢您的回答!我尝试使用 200.00 和 44.00,但不幸的是并没有什么不同。

以上是关于heightForRowAtIndexPath 被调用,但高度没有改变的主要内容,如果未能解决你的问题,请参考以下文章

heightForRowAtIndexPath 被调用,但高度没有改变

从 cellForRowAtIndexPath 中调用 heightForRowAtIndexPath?

删除 iOS8 的“heightForRowAtIndexPath”

如何在 heightForRowAtIndexPath 中获取 UITableViewCell?

UITableView 中的 heightForRowAtIndexPath 都有哪些替换选项?

iOS 触发单格 tableView:heightForRowAtIndexPath: