如何为 iOS 版本运行特定委托?

Posted

技术标签:

【中文标题】如何为 iOS 版本运行特定委托?【英文标题】:How to Run a Specific delegate For iOS Version? 【发布时间】:2018-01-17 09:38:18 【问题描述】:
   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 上无论如何都不能运行来实现这个功能呢?

【问题讨论】:

你项目的目标是什么iOS版本? ios 9 是目标 And.. 你是直接在 UIViewController 子类上定义estimatedHeightForRowAt 方法还是使用符合UITableViewDelegate 的自定义类? 最后一个问题:“在 Ios 10 中,此功能将运行,我的情况将受到干扰”是什么意思——表格视图是否显示高度错误的单元格? 是的,如果此功能在 iOS 10 中运行,我的手机会受到干扰 【参考方案1】:

首先,清除您的错误消息:在您的第一个示例中,您在方法上方添加了@available(iOS 11.0, *);这并不意味着仅在 iOS 11 上使用此方法,而是 此方法仅在 iOS 11 中可用。显然,编译器无法处理这种具有和不具有协议方法一致性的歧义(“薛定谔方法”,有人吗?)。

要解决此问题,您可以创建委托类的 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
  

不是一个非常优雅的解决方案,但它应该可以工作。

【讨论】:

以上是关于如何为 iOS 版本运行特定委托?的主要内容,如果未能解决你的问题,请参考以下文章

当 UICollectionView 位于 iOS 中的自定义 TableViewCell 中时,如何为 UICollectionView 实现委托和数据源方法,目标 C

除了在hadoop集群中设置的时间之外,如何为长时间运行的应用程序更新委托令牌

如何为 QTableView 中的单个单元格设置委托?

您如何为委托参数提供 xml 注释/文档?

Xcode:如何为使用 Storyboard 创建的子视图设置委托?

初始化后如何为 UITextField 分配委托?