Эта функциональность возможна с пользовательским UIViewRepresentable
.
Этот код создаст пользовательский TextField
из UITextField
и позволит вам изменять параметры, такие как font
и autocapitalizationType
у вас есть.
struct CustomTextField: UIViewRepresentable {
class Coordinator: NSObject, UITextFieldDelegate {
@Binding var text: String
@Binding var isEditing: Bool
var didBecomeFirstResponder = false
init(text: Binding<String>, editing: Binding<Bool>) {
_text = text
_isEditing = editing
}
func textFieldDidChangeSelection(_ textField: UITextField) {
text = textField.text ?? ""
}
func textFieldDidBeginEditing(_ textField: UITextField) {
isEditing = true
}
func textFieldDidEndEditing(_ textField: UITextField) {
isEditing = false
}
}
var placeholder = ""
@Binding var text: String
@Binding var isEditing: Bool
var isFirstResponder: Bool = false
var font = UIFont.systemFont(ofSize: 20)
var autocapitalization = UITextAutocapitalizationType.none
var autocorrection = UITextAutocorrectionType.default
var borderStyle = UITextField.BorderStyle.none
func makeUIView(context: UIViewRepresentableContext<CustomTextField>) -> UITextField {
let textField = UITextField(frame: .zero)
textField.delegate = context.coordinator
textField.placeholder = placeholder
textField.font = font
textField.autocapitalizationType = autocapitalization
textField.autocorrectionType = autocorrection
textField.borderStyle = borderStyle
return textField
}
func makeCoordinator() -> CustomTextField.Coordinator {
return Coordinator(text: $text, editing: $isEditing)
}
func updateUIView(_ uiView: UITextField, context: UIViewRepresentableContext<CustomTextField>) {
uiView.text = text
if isFirstResponder && !context.coordinator.didBecomeFirstResponder {
uiView.becomeFirstResponder()
context.coordinator.didBecomeFirstResponder = true
} else if !isFirstResponder && context.coordinator.didBecomeFirstResponder {
uiView.resignFirstResponder()
context.coordinator.didBecomeFirstResponder = false
}
}
}
Кредит: этот код изменен @MatteoPacini здесь .
, ответ на аналогичный вопрос. Я предполагаю, что PlainTextFieldStyle()
эквивалентно UITextField.BorderStyle.none
.
Так что в вашем View
, чтобы «Edit» Button
поднял клавиатуру и изменил на «Done», чтобы опустить клавиатуру, ваш код будет:
Image(colorScheme == .light ? "user" : "userDark")
.resizable()
.frame(width: 30, height: 30)
CustomTextField(
placeholder: "Name",
text: $name,
isEditing: $isEditing,
isFirstResponder: isEditing,
font: .systemFont(ofSize: 20),
autocapitalization: .words,
autocorrection: .no,
borderStyle: .none
)
.padding(.leading, 5)
if name != localName {
Button(action: {
self.name = ""
}) {
Text("Update")
.font(.system(size: 15))
.fontWeight(.light)
.foregroundColor(colorScheme == .light ? Color.black : Color.white)
}
} else if name == localName {
Button(action: {
self.isEditing.toggle()
}) {
Text(self.isEditing ? "Cancel" : "Edit")
.font(.system(size: 15))
.fontWeight(.light)
.foregroundColor(colorScheme == .light ? Color.black : Color.white)
}
}
Если Bool
указывает, что TextField
редактирует:
@State var isEditing = false
Если указанный вами код определяет ячейку List
или Form
, вы можете замените его на IndexSet
или Optional<IndexPath>
ячейки редактирования.
Кроме того, если вы не хотите кнопку "Готово", просто измените Button
на:
Button(action: {
self.isEditing = true
}) {
Text("Edit")
.font(.system(size: 15))
.fontWeight(.light)
.foregroundColor(colorScheme == .light ? Color.black : Color.white)
}
Проверено на Swift Playground в Xcode-beta-2
{ ссылка }