Reputation: 411
I have the following code in my WidgetBundle class, but I want to remove the @available tag since as is, if the user is not iOS 16, they won't have access to Home Screen or Lock Screen widgets at all.
struct WidgetBundler: WidgetBundle {
@WidgetBundleBuilder
var body: some Widget {
HomeScreenWidget()
LockScreenWidget()
}
}
The compiler does not like this code, and it was the only other way I could think of to get around this issue:
struct WidgetBundler: WidgetBundle {
@WidgetBundleBuilder
var body: some Widget {
if #available(iOSApplicationExtension 16, *) {
HomeScreenWidget()
LockScreenWidget()
} else {
HomeScreenWidget()
}
}
}
How do I remove the @available tag and get it so users can access the Home Screen widgets even on iOS 14 and 15?
Upvotes: 1
Views: 243
Reputation: 109
You can use this approach mentioned in avanderlee
@main
struct WidgetsBudler: WidgetBundle {
@WidgetBundleBuilder
var body: some Widget {
widgets()
}
func widgets() -> some Widget {
if #available(iOS 16.0, *) {
return WidgetBundleBuilder.buildBlock(HomeScreenWidget(),
LockScreenWidget())
} else {
return HomeScreenWidget()
}
}
}
Upvotes: 0
Reputation: 914
This solution works:
@main
struct WidgetsBudle: WidgetBundle {
var body: some Widget {
if #available(iOSApplicationExtension 16.0, *) {
return ios16Widgets
} else {
return ios14Widgets
}
}
@WidgetBundleBuilder
var ios14Widgets: some Widget {
HomeScreenWidget()
}
@WidgetBundleBuilder
var ios16Widgets: some Widget {
HomeScreenWidget()
LockScreenWidget()
}
}
Upvotes: 2