func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat
{
let chatMessageStarModel = arrMentionChat[indexPath.row]
if let key = chatMessageStarModel.chatMessageMarkerID?.stringValue() {
if let valueHeight = cellHeight[key] , valueHeight > 0.0{
return valueHeight
}
}
else {
return UITableViewAutomaticDimension
}
return UITableViewAutomaticDimension
}
我希望函数estimatedHeightForRowAt仅针对Ios 11或更高版本运行不适用于Ios 10或任何其他较低版本。如果我使用
@available(iOS 11.0, *)
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat
{
let chatMessageStarModel = arrMentionChat[indexPath.row]
if let key = chatMessageStarModel.chatMessageMarkerID?.stringValue() {
if let valueHeight = cellHeight[key] , valueHeight > 0.0{
return valueHeight
}
}
else {
return UITableViewAutomaticDimension
}
return UITableViewAutomaticDimension
}
我试过的另一种方法是: -
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat
{
if #available(iOS 11.0,*) {
let chatMessageStarModel = arrMentionChat[indexPath.row]
if let key = chatMessageStarModel.chatMessageMarkerID?.stringValue() {
if let valueHeight = cellHeight[key] , valueHeight > 0.0{
return valueHeight
}
}
else {
return UITableViewAutomaticDimension
}
return UITableViewAutomaticDimension
}
}
我知道我需要返回一些东西但是如果我返回0.0或UITableViewAutomaticDimension而不是Ios 10,这个函数将会运行,我的情况会受到干扰。
那么如何仅针对ios 11运行此功能,并且无论如何都无法在ios 10上运行以实现此功能?
答案 0 :(得分:1)
首先,要清除错误消息:在第一个示例中,您在方法上方添加了@available(iOS 11.0, *)
;这并不意味着仅在iOS 11 上使用此方法,而是此方法仅适用于iOS 11 。很明显,编译器无法应对这种模糊性,无论是否具有协议方法一致性(“Schrödinger方法”,任何人?)。
要解决此问题,您可以创建委托类的iOS11特定子类,并在表视图中设置它时检查iOS版本:
class Delegate: NSObject, UITableViewDelegate {
// ... your version-independend delegate code goes here...
}
@available(iOS 11.0, *)
class IOS11Delegate: Delegate {
// ... the iOS11-specific stuff goes here ...
func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
// ... your custom height estimation code goes here ...
}
}
class ViewController: UITableViewController {
private var delegate: Delegate?
override func viewDidLoad() {
super.viewDidLoad()
if #available(iOS 11.0,*) {
delegate = IOS11Delegate()
}
else {
delegate = Delegate()
}
tableView.delegate = delegate
}
}
不是一个非常优雅的解决方案,但它应该有效。