Как я могу обернуть код Objective-C только для VisionOS?

У меня есть следующий код в Objective-C:

      if (@available(iOS 13.0, tvOS 13.0, *)) {
    indicator.indicatorView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleLarge;
} else {
    indicator.indicatorView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
}

Но это вызывает ошибку.

      'UIActivityIndicatorViewStyleWhiteLarge' is unavailable: not available on xrOS

Я думаю, мне нужно это первое условие для запуска, чтобы оно даже не пыталось получить доступUIActivityIndicatorViewStyleWhiteLarge.

Но когда я меняю строку наif (@available(iOS 13.0, tvOS 13.0, visionOS 1.0, *)). Я получаю следующую ошибку:

      Unrecognized platform name visionOS

Я также попробовал изменить его наxrOS 1.0(так как я слышал, что некоторые внутренние пользователи какое-то время использовали его как xrOS. И хотя я не получаю вторую ошибку компилятора, он все равно говорит, что он недоступен.

Есть какие нибудь идеи как это починить?

2 ответа

ИспользоватьTARGET_OS_XRчтобы различать только цели RealityKit:

      #if TARGET_OS_XR

#else

#endif // TARGET_OS_XR

К сожалению, Objective-C ужасен, когда дело касается . Если бы вы написали ту же самую логику в Swift, вы бы не получили предупреждение об устаревании. Я не знаю, почему Objective-C в этом отношении не работает лучше.

Как вы видели, добавлениеxrOS 1.0не устраняет предупреждение об устаревании, несмотря на то, что во время выполненияelseне будет выполнен из-за@available. Таким образом, хотя он и работает во время выполнения, компилятор без необходимости жалуется на ситуацию, на которую не следует рассчитывать.

По моему собственному опыту, единственное решение — использовать директивы компилятора. Хотя мой опыт работы связан с Mac Catalyst, а не с VisionOS, проблема та же.

Вам нужно написать уродливый код, подобный следующему:

      #if TARGET_OS_XROS // I'm guessing on the XROS - use code completion to see your options
    indicator.indicatorView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleLarge;
#else
    if (@available(iOS 13.0, tvOS 13.0, *)) {
        indicator.indicatorView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleLarge;
    } else {
        indicator.indicatorView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
    }
#endif

Плохая часть этого — дублирование кода. Единственные другие варианты — перейти на Swift или принять предупреждение об устаревании.

Другие вопросы по тегам