




Это может быть ошибка, я пытался запустить предварительный просмотр в режиме отлаживать в нескольких случаях и заметил, что при нажатии на текстовое поле консоль выдает ошибки о некоторых ограничениях, которые не выполняются, и к ним нет доступа.
Я также включил «Показать рамки просмотра» в меню «Отладка» Xcode, рамка клавиатуры фактически появляется на экране, но по какой-то причине не отображается. В редких случаях ошибка ограничений исчезала без причины, и клавиатура успешно отображалась, но простой перезапуск предварительного просмотра приводил к ее исчезновению снова. Так что это может быть ошибка, и если это так, надеюсь, что это будет исправлено в следующих выпусках.
Оказывается, этот параметр (очень тонко) связан с параметром «Подключить аппаратную клавиатуру» в приложении iOS Simulator (находится в строке меню как Ввод/вывод → Клавиатура → Подключить аппаратную клавиатуру). Клавиатура будет отображаться только в режиме «Live Preview» и с этой настройкой инвалид, и Xcode мгновенно сбросит настройку, как только обнаружит любой прямой ввод с клавиатуры, в то время как предварительный просмотр имеет фокус (и приложение Simulator будет нет отражать этот сброс, поэтому чтобы сделать это снова, вам придется переключить его дважды). Хуже того, переключение настроек в приложении Simulator само по себе недостаточно; вам нужно заставить предварительный просмотр полностью перезагрузить базовый симулятор, который он использует. Самый простой способ сделать это — перезапустить Xcode или переключиться на другое смоделированное устройство (например, с iPhone 11 на iPhone 12). Вы также можете попробовать выполнить эту команду в терминале:
xcrun simctl --set ~/Library/Developer/Xcode/UserData/Previews/Simulator\ Devices shutdown all
Эта команда не повлияет на какие-либо симуляторы, работающие в приложении iOS Simulator, но буду приводит к тому, что все предварительные просмотры перестают работать до тех пор, пока Xcode не перезапустит симулированные устройства, и может привести к тому, что пользовательский интерфейс Xcode временно будет вести себя странно (или, по крайней мере, эффекты были временными, когда я попробовал это в Xcode 12.4).
После того, как настройка вступила в силу, фокусировка на поле ввода текста вызовет появление области программной клавиатуры. Область реагирует на нажатия и все клавиши работают, но сама клавиатура как будто не рендерится. Очевидно, что это не работает, и это может перестать работать в любое время в будущем.
После каждого полная сборка, но возможно нет после каждого частичная перестройка предварительного просмотра SwiftUI Live Preview.
Существует тесно связанная ошибка, которая препятствует правильному обновлению значения свойства @FocusState представления SwiftUI (если оно есть) в ответ на касание его TextField — даже если описанный выше обходной путь успешно используется для отображения экранной клавиатуры, когда это Нажато TextField — при условии что, что представление SwiftUI — это представление верхнего уровня в предварительном просмотре.
См. ниже демонстрацию этой ошибки и пример того, как ее обойти:
struct MyForm: View {
@FocusState private var isFocused: Bool
@State private var text = ""
var body: some View {
VStack {
Text("isFocused: \(isFocused ? "true" : "false")")
Form {
TextField("Enter text here", text: $text)
.focused($isFocused)
}
}
}
}
struct Bad_MyForm_Previews: PreviewProvider {
static var previews: some View {
/*
* Due to another bug, paired with the fact that MyForm is the top-level
* SwiftUI View in this Preview, the value of MyForm's `@FocusState`
* property won't update in response to its TextField being tapped.
* This is the case, regardless of if this Preview is being run as:
* 1. A "Live Preview" in the Canvas in Xcode,
* 2. Or as a "Preview on Device" via the "Xcode Previews" app on a
* physical iPhone - even if the keyboard shows.
*/
MyForm()
}
}
struct Good_MyForm_Previews: PreviewProvider {
static var previews: some View {
/*
* But the bug mentioned above that prevents the value of `MyForm`'s
* `@FocusState` property from correctly updating in response to its
* TextField being tapped, *won't* affect *this* Preview, as in *this*
* Preview, `MyForm` is *not* the top-level SwiftUI View.
*/
ZStack {
MyForm()
}
}
}
Привет @surfrider, если вы соединили устройство iPhone физический с Xcode, вы можете запустить предварительный просмотр SwiftUI на этом устройстве iPhone физический, нажав кнопку «Предварительный просмотр на устройстве» на холсте в Xcode. Однако, этот не будет устанавливает предварительную версию SwiftUI как приложение на устройстве iPhone физический. Скорее, он запустит приложение, установленное на этом устройстве iPhone физический, называемое приложением «Xcode Previews», и ваша предварительная версия SwiftUI будет запускать Внутри это приложение. Затем вы можете выполнить шаги моего обходного пути на устройстве iPhone физический.
> Отправьте приложение Xcode Previews в фоновый режим (например, проведя пальцем вверх от нижней части экрана, чтобы просмотреть переключатель приложений). Мне не ясно, что вы имеете в виду. Ты про симулятор?