Skip to content

Commit 0f0afc3

Browse files
committed
Fix compilation on tvOS
1 parent 89658f6 commit 0f0afc3

File tree

3 files changed

+58
-44
lines changed

3 files changed

+58
-44
lines changed

.github/workflows/build-test-and-docs.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ jobs:
8080

8181
- name: Build
8282
run: |
83-
set -uexo pipefail
83+
set -uxo pipefail
8484
device_type=${{ matrix.device-type }}
8585
set +e
8686
deviceid=$(xcrun simctl list devices $device_type available | grep -v -- -- | tail -n 1 | grep -oE '[0-9A-F\-]{36}')
@@ -118,6 +118,7 @@ jobs:
118118
)
119119
else
120120
echo "No $device_type simulators found" >&2
121+
false
121122
fi
122123
123124
- name: Extract UIKitBackend symbol graphs

Examples/Package.resolved

Lines changed: 7 additions & 9 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Sources/UIKitBackend/UIKitBackend+Control.swift

Lines changed: 49 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,13 @@ final class TextFieldWidget: WrapperWidget<UITextField>, UITextFieldDelegate {
5959

6060
final 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)
174185
final 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)
202217
final 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

Comments
 (0)