Swift Widget、タップでアプリのナビゲーション先画面表示
Widget
タップ
struct Choi_CalEntryView : View {
@Environment(\.widgetFamily) var family: WidgetFamily
var entry: Provider.Entry
var body: some View {
GeometryReader { geometry in
VStack(alignment: .leading) {
HStack {
Spacer()
Text(entry.event.calenderTitle)
.font(.footnote)
.lineLimit(1)
Spacer()
}
RoundedRectangle(cornerRadius: 3, style: .circular)
.fill(entry.event.calendarColor)
.frame(width: geometry.size.width, height: 3, alignment: .center)
switch self.family {
case .systemSmall:
SmallView(entry: self.entry)
case .systemMedium:
MiddleView(entry: self.entry)
case .systemLarge:
Text("Large")
default:
Text("default")
}
}
.widgetURL(self.entry.event.url)
}
.padding(8)
}
}
「func widgetURL(_ url: URL?) -> some View」を使用する。
アプリ側で判断がつくURLを設定する。
上記コードはユニークになるIDを使用してURLにしています。
necal://ユニークID
アプリ
Widgetのタップ受信
struct EventView: View {
@EnvironmentObject var eventsModel: EventsModel
@State var onEventList: Bool = false
let event: EventDispModel
var body: some View {
NavigationLink(
destination: EventListView(eventList: self.eventsModel.getEventList(calendars: [self.event.calendar]), title: self.event.calendar.title),
isActive: self.$onEventList) {
VStack(alignment: .leading, spacing: 8.0) {
HStack {
Text(self.event.calendar.title)
.foregroundColor(Color(self.event.calendar.cgColor))
Spacer()
}
HStack {
Text(EventsModel.dateDisp(date: self.event.startDate, isAllDay: self.event.isAllDay))
Spacer()
}
HStack {
Text(self.event.eventTitle)
Spacer()
}
}
}
.onOpenURL(perform: { url in
let ekcalendar = self.eventsModel.getEKCakendar(calendarIdentifier: url.absoluteString.replacingOccurrences(of: "necal://", with: ""))
if event.calendar.calendarIdentifier == ekcalendar?.calendarIdentifier {
print("onOpenURL:\(event.calendar.title)")
self.onEventList.toggle()
}
})
}
}
「func onOpenURL(perform action: @escaping (URL) -> ()) -> some View」を使用する。
受けたい場所に追加する。
例えば、複数表示されるサブViewに追加すると、各サブViewでコールされる。
上記コードは複数コールされる場所。
自分の情報と比較して対象時にアクション(上記コードの場合はNavigationLink遷移)実施。
ナビゲーション先を表示
NavigationLinkの「init(destination: Destination, isActive: Binding
actionSheet等と同じ仕組み。trueにする事で遷移(表示)。







