How to only override a method depending on the runtime system iOS version?

后端 未结 2 519
滥情空心
滥情空心 2020-12-06 06:05

I\'ve implemented automatic dynamic tableview cell heights for iOS 8 by using

self.tableView.rowHeight = UITableViewAutomaticDimension;

For

相关标签:
2条回答
  • 2020-12-06 06:35

    I found a simple solution. Declared this macro to recognize if user has iOS 8.0 or later:

    #define IS_IOS_8_OR_LATER ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
    

    Then, inside heightForRowAtIndexPath I added the following code:

    if (IS_IOS_8_OR_LATER) {
            self.tableView.rowHeight = UITableViewAutomaticDimension;
            return self.tableView.rowHeight;
        } else {//Custom code for ios version earlier than 8.0
    
    }
    

    This solved the problem

    0 讨论(0)
  • 2020-12-06 06:43

    One solution would be to override the respondsToSelector: method in your view controller. Have it return NO under iOS 8 when checking for the heightForRowAtIndexPath: method.

    - (BOOL)respondsToSelector:(SEL)selector {
        static BOOL useSelector;
        static dispatch_once_t predicate = 0;
        dispatch_once(&predicate, ^{
            useSelector = [[UIDevice currentDevice].systemVersion floatValue] < 8.0 ? YES : NO;
        });
    
        if (selector == @selector(tableView:heightForRowAtIndexPath:)) {
            return useSelector;
        }
    
        return [super respondsToSelector:selector];
    }
    

    This way, when the table view make a call like:

    if ([self.delegate respondsToSelector:@selector(tableView:heightForRowAtIndexPath:)]) {
    }
    

    your code will return NO under iOS 8 or later and YES under iOS 7 or earlier.

    0 讨论(0)
提交回复
热议问题