Skip to content

Commit 4e87341

Browse files
authored
Merge pull request #358 from Esri/Caleb/Fix-MacCatalystCustomBooleanBindingsBug
[Fix] Custom Boolean bindings bug on Mac Catalyst
2 parents 252cbf4 + 358b318 commit 4e87341

File tree

4 files changed

+80
-52
lines changed

4 files changed

+80
-52
lines changed

Shared/Samples/Display dimensions/DisplayDimensionsView.swift

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,12 @@ struct DisplayDimensionsView: View {
2222
/// The dimensional layer added to the map.
2323
@State private var dimensionLayer: DimensionLayer?
2424

25+
/// A Boolean value indicating whether the dimension layer's content is visible.
26+
@State private var dimensionLayerIsVisible = true
27+
28+
/// A Boolean value indicating whether the dimension layer's definition expression is set.
29+
@State private var definitionExpressionIsSet = false
30+
2531
/// The error shown in the error alert.
2632
@State private var error: Error?
2733

@@ -38,14 +44,18 @@ struct DisplayDimensionsView: View {
3844
VStack {
3945
Spacer()
4046
Group {
41-
Toggle("Dimension Layer", isOn: Binding(
42-
get: { dimensionLayer?.isVisible ?? false },
43-
set: { dimensionLayer?.isVisible = $0 }
44-
))
45-
Toggle("Definition Expression:\nDimensions >= 450m", isOn: Binding(
46-
get: { dimensionLayer?.definitionExpression == "DIMLENGTH >= 450" },
47-
set: { dimensionLayer?.definitionExpression = $0 ? "DIMLENGTH >= 450" : "" }
48-
))
47+
Toggle("Dimension Layer", isOn: $dimensionLayerIsVisible)
48+
.onChange(of: dimensionLayerIsVisible) { newValue in
49+
dimensionLayer?.isVisible = newValue
50+
}
51+
52+
Toggle(
53+
"Definition Expression:\nDimensions >= 450m",
54+
isOn: $definitionExpressionIsSet
55+
)
56+
.onChange(of: definitionExpressionIsSet) { newValue in
57+
dimensionLayer?.definitionExpression = newValue ? "DIMLENGTH >= 450" : ""
58+
}
4959
}
5060
.padding(8)
5161
.background(.ultraThinMaterial)

Shared/Samples/Find route around barriers/FindRouteAroundBarriersView.Views.swift

Lines changed: 30 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -16,43 +16,47 @@ import ArcGIS
1616
import SwiftUI
1717

1818
extension FindRouteAroundBarriersView {
19-
/// The list of settings for the sample.
20-
struct SettingsList: View {
21-
/// The view model for the sample.
22-
@ObservedObject var model: Model
19+
/// A list of settings for modifying route parameters.
20+
struct RouteParametersSettings: View {
21+
/// The route parameters to modify.
22+
private let routeParameters: RouteParameters
2323

2424
/// A Boolean value indicating whether routing will find the best sequence.
25-
@State private var routingFindsBestSequence = false
25+
@State private var routingFindsBestSequence: Bool
26+
27+
/// A Boolean value indicating whether routing will preserve the first stop.
28+
@State private var routePreservesFirstStop: Bool
29+
30+
/// A Boolean value indicating whether routing will preserve the last stop.
31+
@State private var routePreservesLastStop: Bool
32+
33+
init(for routeParameters: RouteParameters) {
34+
self.routeParameters = routeParameters
35+
self.routingFindsBestSequence = routeParameters.findsBestSequence
36+
self.routePreservesFirstStop = routeParameters.preservesFirstStop
37+
self.routePreservesLastStop = routeParameters.preservesLastStop
38+
}
2639

2740
var body: some View {
2841
List {
29-
Toggle(isOn: $routingFindsBestSequence) {
30-
Text("Find Best Sequence")
31-
}
32-
.onChange(of: routingFindsBestSequence) { newValue in
33-
model.routeParameters.findsBestSequence = newValue
34-
}
42+
Toggle("Find Best Sequence", isOn: $routingFindsBestSequence)
43+
.onChange(of: routingFindsBestSequence) { newValue in
44+
routeParameters.findsBestSequence = newValue
45+
}
3546

3647
Section {
37-
Toggle(isOn: Binding(
38-
get: { model.routeParameters.preservesFirstStop },
39-
set: { model.routeParameters.preservesFirstStop = $0 }
40-
)) {
41-
Text("Preserve First Stop")
42-
}
48+
Toggle("Preserve First Stop", isOn: $routePreservesFirstStop)
49+
.onChange(of: routePreservesFirstStop) { newValue in
50+
routeParameters.preservesFirstStop = newValue
51+
}
4352

44-
Toggle(isOn: Binding(
45-
get: { model.routeParameters.preservesLastStop },
46-
set: { model.routeParameters.preservesLastStop = $0 }
47-
)) {
48-
Text("Preserve Last Stop")
49-
}
53+
Toggle("Preserve Last Stop", isOn: $routePreservesLastStop)
54+
.onChange(of: routePreservesLastStop) { newValue in
55+
routeParameters.preservesLastStop = newValue
56+
}
5057
}
5158
.disabled(!routingFindsBestSequence)
5259
}
53-
.onAppear {
54-
routingFindsBestSequence = model.routeParameters.findsBestSequence
55-
}
5660
}
5761
}
5862

Shared/Samples/Find route around barriers/FindRouteAroundBarriersView.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ struct FindRouteAroundBarriersView: View {
119119
Spacer()
120120

121121
SheetButton(title: "Route Settings") {
122-
SettingsList(model: model)
122+
RouteParametersSettings(for: model.routeParameters)
123123
} label: {
124124
Image(systemName: "gear")
125125
}

Shared/Samples/Group layers together/GroupLayersTogetherView.GroupLayerListView.swift

Lines changed: 31 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,7 @@ extension GroupLayersTogetherView {
3434
case .independent:
3535
// Toggles for sublayers that can change their visibility independently.
3636
ForEach(groupLayer.layers, id: \.name) { layer in
37-
Toggle(isOn: isVisibleBinding(for: layer)) {
38-
Text(formatLayerName(of: layer.name))
39-
}
37+
LayerVisibilityToggle(formatLayerName(of: layer.name), layer: layer)
4038
}
4139

4240
case .exclusive:
@@ -64,10 +62,7 @@ extension GroupLayersTogetherView {
6462
}
6563
.disabled(isDisabled)
6664
} header: {
67-
// The group layer visibility toggle.
68-
Toggle(isOn: isVisibleBinding(for: groupLayer)) {
69-
Text(groupLayer.name)
70-
}
65+
LayerVisibilityToggle(groupLayer.name, layer: groupLayer)
7166
}
7267
.task {
7368
// Listen for changes to is visible to disable the section
@@ -86,16 +81,6 @@ extension GroupLayersTogetherView {
8681
}
8782
}
8883

89-
/// Creates a custom binding for toggling a layers's visibility.
90-
/// - Parameter layer: The `Layer` to create the `Binding` from.
91-
/// - Returns: The new custom `Binding` object.
92-
private func isVisibleBinding(for layer: Layer) -> Binding<Bool> {
93-
return Binding(
94-
get: { layer.isVisible },
95-
set: { layer.isVisible = $0 }
96-
)
97-
}
98-
9984
/// Formats a layer's name to be more human readable.
10085
/// - Parameter name: The original `String` name of the layer.
10186
/// - Returns: A `String` with the modified name or the original if the name is not found.
@@ -116,4 +101,33 @@ extension GroupLayersTogetherView {
116101
}
117102
}
118103
}
104+
105+
/// A toggle for changing a given layer's visibility.
106+
private struct LayerVisibilityToggle: View {
107+
/// The title of the toggle.
108+
private let title: String
109+
110+
/// The layer with the visibility to change.
111+
private let layer: Layer
112+
113+
/// A Boolean value indicating whether the layer's content is visible.
114+
@State private var isVisible: Bool
115+
116+
/// Creates the toggle for changing a given layer's visibility.
117+
/// - Parameters:
118+
/// - title: A string for the title of the toggle.
119+
/// - layer: The layer with the visibility to change.
120+
init(_ title: String, layer: Layer) {
121+
self.title = title
122+
self.layer = layer
123+
self.isVisible = layer.isVisible
124+
}
125+
126+
var body: some View {
127+
Toggle(title, isOn: $isVisible)
128+
.onChange(of: isVisible) { newValue in
129+
layer.isVisible = newValue
130+
}
131+
}
132+
}
119133
}

0 commit comments

Comments
 (0)