Как я могу обернуть код 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 или принять предупреждение об устаревании.