Как только переопределить метод в зависимости от версии iOS для операционной системы?

Я реализовал автоматическую динамическую высоту ячеек таблицы для iOS 8, используя

self.tableView.rowHeight = UITableViewAutomaticDimension;

Для pre-iOS 8, который не поддерживает автоматическую динамическую высоту ячеек, я переопределил метод heightForRowAtIndexPath.

Это похоже на то, что я сделал: Использование автоматической компоновки в UITableView для динамических раскладок ячеек и переменных высот строк

Проблема заключается в том, как писать код, который использует автоматическую высоту ячеек для iOS 8, но переопределяет heightForRowAtIndexPath для более ранних версий iOS. Мне нужен мой метод heightForRowAtIndexPath, только если версия iOS меньше 8. Любые предложения о том, как это сделать?

Ответ 1

Одним из решений было бы переопределить метод respondsToSelector: в вашем контроллере представления. Попросите его вернуть NO под iOS 8 при проверке метода heightForRowAtIndexPath:.

- (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];
}

Таким образом, когда представление таблицы вызывает вызов типа:

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

ваш код вернет NO под iOS 8 или новее и YES под iOS 7 или ранее.

Ответ 2

Я нашел простое решение. Объявил, что этот макрос распознает, имеет ли пользователь iOS 8.0 или новее:

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

Затем внутри heightForRowAtIndexPath я добавил следующий код:

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

}

Это позволило решить проблему