下面的代码在Xcode 11.6 / iOS 13.6中遇到了SwiftUI中的一个奇怪的错误。
它将呈现两个带有白色边框的文本字段(如果不使用黑暗模式,则可以更改为黑色边框)。错误是,点击手势识别器的命中区域与SecureField的命中区域不相同。因此,您可以点击字段的边缘,尽管识别器会触发,但实际的文本字段不会成为第一个响应器。。
为了说明这一点,我将两个UITextFields ( SwiftUI在引擎盖下使用的)的背景色设置为绿色。要使给定的UITextField“成为第一个响应者”,您必须在这个绿色区域内点击,否则您不能键入该字段。
问题是,由于我们的应用程序是跨平台的,即它将运行在AppKit或UIKit上,所以我们不想使用任何基于UIKit的方法来处理UI的工作方式。我们需要知道用户目前正在编辑哪个字段,这样我们就可以将该字段的边框颜色设置为绿色(根据我们UIX团队的设计要求)。因此,由于我们不能设置委托来侦听普通的UITextField委托方法,所以我们决定使用tap手势识别器来确定用户何时编辑给定的字段。
然而,现在我们遇到了这样的问题:填充区域包含在我们在tapGestureRecognizer中添加的SwiftUI中,但是底层文本字段本身不会收到这样的手势,除非它位于填充区内的较小区域。
什么是完全可以在SwiftUI中完成的解决方案?

import PlaygroundSupport
import SwiftUI
import UIKit
public extension View {
var any: AnyView { AnyView(self) }
}
struct Value: Identifiable {
typealias ID = Int
let id: ID
var text: String = ""
}
struct MyView: View {
@State var fields: [Value] = [Value(id: 0), Value(id: 1)]
init() {
UITextField.appearance().backgroundColor = .green
}
var body: some View {
ForEach(fields) { field in
SecureField(
" ",
text: self.$fields[field.id].text,
onCommit: {
print("committed")
})
.onTapGesture {
print("tapped")
}
.padding(12)
.overlay(
RoundedRectangle(
cornerRadius: 5
).stroke(
Color.white,
lineWidth: 2
)
)
}
}
}发布于 2020-08-14 21:59:05
如果你愿意的话就笑吧,但是这个该死的工作(让它在我的子虚乌有。目标):
class MrEnvironment: ObservableObject {
/// Set this to id in .onTapGesture of the View
@Published public var tappedId: Int? = nil
/// Call this later from wherever to resign first responder
public var resignFirstResponder: (() -> Bool)?
private static var textFieldDidStartEditingPublisher =
NotificationCenter.default.publisher(
for: UITextField.textDidBeginEditingNotification)
/// Only publishes when user tapped on the field AND started editing it
private var whichTextFieldIsEditingPublisher =
Publishers.Zip(Self.textFieldDidStartEditingPublisher, $tappedId)
let win: AnyCancellable =
whichTextFieldIsEditingPublisher
.sink { [weak self] notification, _ in
let view = notification.object as? UIView
self?.resignFirstResponder = view?.resignFirstResponder
// now since we know id of the field we can do anything to it
// like set the border color etc.
}
// etc. other stuff
}
}https://stackoverflow.com/questions/63402414
复制相似问题