@@ -59,6 +59,17 @@ 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 os(tvOS)
65+ if !isEditable {
66+ child. resignFirstResponder ( )
67+ }
68+ #else
69+ child. isEditable = isEditable
70+ #endif
71+ }
72+ }
6273
6374 init ( ) {
6475 super. init ( child: UITextView ( ) )
@@ -68,6 +79,10 @@ final class TextEditorWidget: WrapperWidget<UITextView>, UITextViewDelegate {
6879 func textViewDidChange( _: UITextView ) {
6980 onChange ? ( child. text ?? " " )
7081 }
82+
83+ func textViewShouldBeginEditing( _: UITextView ) -> Bool {
84+ return isEditable
85+ }
7186}
7287
7388#if os(tvOS)
@@ -172,32 +187,36 @@ final class TappableWidget: ContainerWidget {
172187
173188@available ( tvOS, unavailable)
174189final 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
190+ // So much as attempting to reference UIHoverGestureRecognizer here results in a linker error on tvOS.
191+ #if !os(tvOS)
192+ private var hoverGestureRecognizer : UIHoverGestureRecognizer ?
193+
194+ var hoverChangesHandler : ( ( Bool ) -> Void ) ? {
195+ didSet {
196+ if hoverChangesHandler != nil && hoverGestureRecognizer == nil {
197+ let gestureRecognizer = UIHoverGestureRecognizer (
198+ target: self ,
199+ action: #selector( hoveringChanged ( _: ) ) )
200+ child. view. addGestureRecognizer ( gestureRecognizer)
201+ self . hoverGestureRecognizer = gestureRecognizer
202+ } else if hoverChangesHandler == nil , let hoverGestureRecognizer {
203+ child. view. removeGestureRecognizer ( hoverGestureRecognizer)
204+ self . hoverGestureRecognizer = nil
205+ }
188206 }
189207 }
190- }
191208
192- @objc
193- func hoveringChanged( _ recognizer: UIHoverGestureRecognizer ) {
194- switch recognizer. state {
195- case . began: hoverChangesHandler ? ( true )
196- case . ended: hoverChangesHandler ? ( false )
197- default : break
209+ @objc
210+ func hoveringChanged( _ recognizer: UIHoverGestureRecognizer ) {
211+ switch recognizer. state {
212+ case . began: hoverChangesHandler ? ( true )
213+ case . ended: hoverChangesHandler ? ( false )
214+ default : break
215+ }
198216 }
199- }
217+ #endif
200218}
219+
201220@available ( tvOS, unavailable)
202221final class SliderWidget : WrapperWidget < UISlider > {
203222 var onChange : ( ( Double ) -> Void ) ?
@@ -332,7 +351,7 @@ extension UIKitBackend {
332351 ) {
333352 let textEditorWidget = textEditor as! TextEditorWidget
334353
335- textEditorWidget. child . isEditable = environment. isEnabled
354+ textEditorWidget. isEditable = environment. isEnabled
336355 textEditorWidget. child. font = environment. resolvedFont. uiFont
337356 textEditorWidget. child. textColor = UIColor ( color: environment. suggestedForegroundColor)
338357 textEditorWidget. onChange = onChange
@@ -448,20 +467,20 @@ extension UIKitBackend {
448467 }
449468 }
450469
451- public func createHoverTarget( wrapping child: Widget ) -> Widget {
452- HoverableWidget ( child: child)
453- }
470+ #if os(iOS) || os(visionOS) || targetEnvironment(macCatalyst)
471+ public func createHoverTarget( wrapping child: Widget ) -> Widget {
472+ HoverableWidget ( child: child)
473+ }
454474
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- }
475+ public func updateHoverTarget(
476+ _ hoverTarget: any WidgetProtocol ,
477+ environment: EnvironmentValues ,
478+ action: @escaping ( Bool ) -> Void
479+ ) {
480+ let wrapper = hoverTarget as! HoverableWidget
481+ wrapper. hoverChangesHandler = action
482+ }
463483
464- #if os(iOS) || os(visionOS) || targetEnvironment(macCatalyst)
465484 public func createSlider( ) -> Widget {
466485 SliderWidget ( )
467486 }
0 commit comments