@@ -59,6 +59,13 @@ final class TextFieldWidget: WrapperWidget<UITextField>, UITextFieldDelegate {
5959
6060final class TextEditorWidget : WrapperWidget < UITextView > , UITextViewDelegate {
6161 var onChange : ( ( String ) -> Void ) ?
62+ var isEditable : Bool = true {
63+ didSet {
64+ if !isEditable {
65+ child. resignFirstResponder ( )
66+ }
67+ }
68+ }
6269
6370 init ( ) {
6471 super. init ( child: UITextView ( ) )
@@ -68,6 +75,10 @@ final class TextEditorWidget: WrapperWidget<UITextView>, UITextViewDelegate {
6875 func textViewDidChange( _: UITextView ) {
6976 onChange ? ( child. text ?? " " )
7077 }
78+
79+ func textViewShouldBeginEditing( _: UITextView ) -> Bool {
80+ return isEditable
81+ }
7182}
7283
7384#if os(tvOS)
@@ -172,32 +183,36 @@ final class TappableWidget: ContainerWidget {
172183
173184@available ( tvOS, unavailable)
174185final class HoverableWidget : ContainerWidget {
175- private var hoverGestureRecognizer : UIHoverGestureRecognizer ?
176-
177- var hoverChangesHandler : ( ( Bool ) -> Void ) ? {
178- didSet {
179- if hoverChangesHandler != nil && hoverGestureRecognizer == nil {
180- let gestureRecognizer = UIHoverGestureRecognizer (
181- target: self ,
182- action: #selector( hoveringChanged ( _: ) ) )
183- child. view. addGestureRecognizer ( gestureRecognizer)
184- self . hoverGestureRecognizer = gestureRecognizer
185- } else if hoverChangesHandler == nil , let hoverGestureRecognizer {
186- child. view. removeGestureRecognizer ( hoverGestureRecognizer)
187- self . hoverGestureRecognizer = nil
186+ // So much as attempting to reference UIHoverGestureRecognizer here results in a linker error on tvOS.
187+ #if !os(tvOS)
188+ private var hoverGestureRecognizer : UIHoverGestureRecognizer ?
189+
190+ var hoverChangesHandler : ( ( Bool ) -> Void ) ? {
191+ didSet {
192+ if hoverChangesHandler != nil && hoverGestureRecognizer == nil {
193+ let gestureRecognizer = UIHoverGestureRecognizer (
194+ target: self ,
195+ action: #selector( hoveringChanged ( _: ) ) )
196+ child. view. addGestureRecognizer ( gestureRecognizer)
197+ self . hoverGestureRecognizer = gestureRecognizer
198+ } else if hoverChangesHandler == nil , let hoverGestureRecognizer {
199+ child. view. removeGestureRecognizer ( hoverGestureRecognizer)
200+ self . hoverGestureRecognizer = nil
201+ }
188202 }
189203 }
190- }
191204
192- @objc
193- func hoveringChanged( _ recognizer: UIHoverGestureRecognizer ) {
194- switch recognizer. state {
195- case . began: hoverChangesHandler ? ( true )
196- case . ended: hoverChangesHandler ? ( false )
197- default : break
205+ @objc
206+ func hoveringChanged( _ recognizer: UIHoverGestureRecognizer ) {
207+ switch recognizer. state {
208+ case . began: hoverChangesHandler ? ( true )
209+ case . ended: hoverChangesHandler ? ( false )
210+ default : break
211+ }
198212 }
199- }
213+ #endif
200214}
215+
201216@available ( tvOS, unavailable)
202217final class SliderWidget : WrapperWidget < UISlider > {
203218 var onChange : ( ( Double ) -> Void ) ?
@@ -332,7 +347,7 @@ extension UIKitBackend {
332347 ) {
333348 let textEditorWidget = textEditor as! TextEditorWidget
334349
335- textEditorWidget. child . isEditable = environment. isEnabled
350+ textEditorWidget. isEditable = environment. isEnabled
336351 textEditorWidget. child. font = environment. resolvedFont. uiFont
337352 textEditorWidget. child. textColor = UIColor ( color: environment. suggestedForegroundColor)
338353 textEditorWidget. onChange = onChange
@@ -448,20 +463,20 @@ extension UIKitBackend {
448463 }
449464 }
450465
451- public func createHoverTarget( wrapping child: Widget ) -> Widget {
452- HoverableWidget ( child: child)
453- }
466+ #if os(iOS) || os(visionOS) || targetEnvironment(macCatalyst)
467+ public func createHoverTarget( wrapping child: Widget ) -> Widget {
468+ HoverableWidget ( child: child)
469+ }
454470
455- public func updateHoverTarget(
456- _ hoverTarget: any WidgetProtocol ,
457- environment: EnvironmentValues ,
458- action: @escaping ( Bool ) -> Void
459- ) {
460- let wrapper = hoverTarget as! HoverableWidget
461- wrapper. hoverChangesHandler = action
462- }
471+ public func updateHoverTarget(
472+ _ hoverTarget: any WidgetProtocol ,
473+ environment: EnvironmentValues ,
474+ action: @escaping ( Bool ) -> Void
475+ ) {
476+ let wrapper = hoverTarget as! HoverableWidget
477+ wrapper. hoverChangesHandler = action
478+ }
463479
464- #if os(iOS) || os(visionOS) || targetEnvironment(macCatalyst)
465480 public func createSlider( ) -> Widget {
466481 SliderWidget ( )
467482 }
0 commit comments