【じっくりSw1ftUI50】実践編20〜第32章 NavigationSplitView を使用した SwiftUI での複数列ナビゲーション
さてと前回、
でリストとナビゲーションのチュートリアルまではやったので、今回は、
NavigationSplitView を使用した SwiftUI での複数列ナビゲーション
をやってく〜〜〜🕺
毎度、オイラの学びなんざ不要って人は、
で全部載ってるみたいだからそっちでやればいいんじゃね?
んだば、早速
じっくり第32章を読んでく👓
概要では
スマホを横に向けた時に、リストを複数列にするビューの作り方
で、
次回でやるチュートリアルの準備も兼ねて概要を説明するぜ🕺
的なことを書いてんね👀💦
構文なんかも書いてるけど、実際に動かした方がわかりやすそうなんで、
早速、実際の組み込み〜〜〜
import SwiftUI
struct E32ContentsView: View {
var body: some View {
Text("Hello, World")
}
}
#Preview {
E32ContentsView()
}
てな感じで、まずは今回用のSwiftUIファイルを用意して〜〜〜
まずはテケトーに、NavigationSplitViewを配置
import SwiftUI
struct E32ContentsView: View {
@State private var flavors = ["青い","普通","完熟"]
@State private var selectedFlavor: String?
var body: some View {
NavigationSplitView{
List(flavors, id: \.self,selection: $selectedFlavor){ flavor in
Text(flavor).tag(flavor)
}
}detail: {
Text(selectedFlavor ?? "風味を選択")
}
}
}
#Preview {
E32ContentsView()
}
で、iPhone15でやると今のところ変化はないね👀💦
と、これをiPhone15ProMaxかiPadでやってみると、、、
左上をタップすると、、、
ここでポイント①:今回の機能は、
iPadやiPhoneProMaxシリーズなんかの
画面のインチ数が大きな物で、
リストの表示に違いをつけたい時に使える機能
ってことがわかったと思う。
さてと、次は色んな設定をやっていこう🕺
import SwiftUI
struct E32ContentsView: View {
@State private var flavors = ["青い","普通","完熟"]
@State private var selectedFlavor: String?
var body: some View {
NavigationSplitView{
List(flavors, id: \.self,selection: $selectedFlavor){ flavor in
Text(flavor).tag(flavor)
}
.navigationSplitViewColumnWidth(150)
}detail: {
Text(selectedFlavor ?? "風味を選択")
}
.navigationSplitViewStyle(.prominentDetail)
}
}
#Preview {
E32ContentsView()
}
てな感じでコードを追記して〜〜〜
ここでポイント②:スタイル設定の値
冒頭のリンク先の記述を参考に、
NavigationSplitView は次のスタイル オプションをサポート
automatic– 現在のコンテンツ、画面サイズ、列の選択などの要素に基づいて列の表示方法を決定
balanced – サイドバーとコンテンツ列にスペースを確保するために、必要に応じて詳細列の幅が縮小。
distinctiveDetail – サイドバーとコンテンツ列がビューに追加され、ビューから削除されたときに、詳細列のサイズが変更されないようにする。このスタイルにより、通常、サイドバーとコンテンツ列が詳細列と重なる。
てな感じらしい。
👉コンテンツなんかがほぼない今の状態では、そら、違いはないわな🤣
続いて、列の表示を制御〜〜〜
ここでポイント③:列の表示を制御
ここもリンクを参考にすると、
automatic– ナビゲーション ビューで、使用可能な画面スペースに基づいて、表示する列を決定。
all – サイドバー、コンテンツ、詳細列を表示。
doubleColumn – 2 列構成では、この設定によりサイドバーと詳細列が表示。3 列構成では、コンテンツ列と詳細列のみが表示。
detailOnly – 詳細列のみが表示。
てな感じらしい👀💦
ま、実際にやってみないと何言ってるかちょっと意味がわからないんですけど(サンドの富澤さん笑)になるので〜〜〜
実際にコードで動かしてみると、、、
import SwiftUI
struct E32ContentsView: View {
@State private var flavors = ["青い","普通","完熟"]
@State private var selectedFlavor: String?
@State private var columnVisibility = NavigationSplitViewVisibility.detailOnly
var body: some View {
NavigationSplitView(columnVisibility:$columnVisibility){
List(flavors, id: \.self,selection: $selectedFlavor){ flavor in
Text(flavor).tag(flavor)
}
.navigationSplitViewColumnWidth(150)
}detail: {
Text(selectedFlavor ?? "風味を選択")
}
.navigationSplitViewStyle(.prominentDetail)
}
}
#Preview {
E32ContentsView()
}
と今の状態だと、
どれでやっても変化なし
なのがわかるね👀💦とりあえず、今回は、
あくまでも複数列のリストビューの表示の概要
って感じなので以上😛
今回のコードまとめ
import SwiftUI
struct E32ContentsView: View {
@State private var flavors = ["青い","普通","完熟"]
@State private var selectedFlavor: String?
@State private var columnVisibility = NavigationSplitViewVisibility.doubleColumn
var body: some View {
NavigationSplitView(columnVisibility:$columnVisibility){
List(flavors, id: \.self,selection: $selectedFlavor){ flavor in
Text(flavor).tag(flavor)
}
.navigationSplitViewColumnWidth(150)
}detail: {
Text(selectedFlavor ?? "風味を選択")
}
.navigationSplitViewStyle(.prominentDetail)
}
}
#Preview {
E32ContentsView()
}
Apple公式
さてと、次回は、
今回概要でやった NavigationSplitViewの実践をやる
第33章 SwiftUI ナビゲーション スプリットビュー チュートリアル
をやってく🕺
記事公開後、
いつもどおり、
でやった操作を〜〜〜
サンプルコード
◾️Essentials32.swift
import SwiftUI
import WebKit
//タイトル
let essentialsChapter32NavigationTitle = "第32章"
let essentialsChapter32Title = "第32章 NavigationSplitView を使用した SwiftUI での複数列ナビゲーション"
let essentialsChapter32SubTitle = "第1節 NavigationSplitView を使用した SwiftUI での複数列ナビゲーション"
//コード
let codeEssentials32 = """
struct Essentials32ContentsView: View {
@State private var flavors = ["青い","普通","完熟"]
@State private var selectedFlavor: String?
@State private var columnVisibility = NavigationSplitViewVisibility.doubleColumn
var body: some View {
NavigationSplitView(columnVisibility:$columnVisibility){
List(flavors, id: \\.self,selection: $selectedFlavor){ flavor in
Text(flavor).tag(flavor)
}
.navigationSplitViewColumnWidth(150)
}detail: {
Text(selectedFlavor ?? "風味を選択")
}
.navigationSplitViewStyle(.prominentDetail)
}
}
#Preview {
Essentials32ContentsView()
}
"""
//ポイント
let pointEssentials32 = """
1、今回の機能は、iPadやiPhoneProMaxシリーズなんかの
画面のインチ数が大きな物で、リストの表示に違いをつけたい時に使える機能
2、スタイル設定の値
冒頭のリンク先の記述を参考に、
・NavigationSplitViewは次のスタイルオプションをサポート
・automatic– 現在のコンテンツ、画面サイズ、列の選択などの要素に基づいて列の表示方法を決定
・balanced – サイドバーとコンテンツ列にスペースを確保するために、必要に応じて詳細列の幅が縮小。
・distinctiveDetail – サイドバーとコンテンツ列がビューに追加され、ビューから削除されたときに、詳細列のサイズが変更されないようにする。このスタイルにより、通常、サイドバーとコンテンツ列が詳細列と重なる。
3、列の表示を制御
ここもリンクを参考にすると、
・automatic– ナビゲーションビューで、使用可能な画面スペースに基づいて、表示する列を決定。
・all – サイドバー、コンテンツ、詳細列を表示。
・doubleColumn – 2列構成では、この設定によりサイドバーと詳細列が表示。3列構成では、コンテンツ列と詳細列のみが表示。
・detailOnly – 詳細列のみが表示。
"""
//URL
let urlEssentials32 = "https://note.com/m_kakudo/n/n5680eaae7916"
//ビュー管理構造体
struct ListiOSApp17DevelopmentEssentialsCh32: Identifiable {
var id: Int
var title: String
var view: ViewEnumiOSApp17DevelopmentEssentialsCh32
}
//遷移先の画面を格納する列挙型
enum ViewEnumiOSApp17DevelopmentEssentialsCh32{
case Sec1
}
//各項目に表示するリスト項目
let dataiOSApp17DevelopmentEssentialsCh32: [ListiOSApp17DevelopmentEssentialsCh32] = [
ListiOSApp17DevelopmentEssentialsCh32(id: 1, title: essentialsChapter32SubTitle, view: .Sec1),
]
struct iOSApp17DevelopmentEssentialsCh32: View {
var body: some View {
VStack {
Divider()
List (dataiOSApp17DevelopmentEssentialsCh32) { data in
self.containedViewiOSApp17DevelopmentEssentialsCh32(dataiOSApp17DevelopmentEssentialsCh32: data)
}
.edgesIgnoringSafeArea([.bottom])
}
.navigationTitle(essentialsChapter32NavigationTitle)
.navigationBarTitleDisplayMode(.inline)
}
//タップ後に遷移先へ遷移させる関数
func containedViewiOSApp17DevelopmentEssentialsCh32(dataiOSApp17DevelopmentEssentialsCh32: ListiOSApp17DevelopmentEssentialsCh32) -> AnyView {
switch dataiOSApp17DevelopmentEssentialsCh32.view {
case .Sec1:
return AnyView(NavigationLink (destination: Essentials32()) {
Text(dataiOSApp17DevelopmentEssentialsCh32.title)
})
}
}
}
#Preview {
iOSApp17DevelopmentEssentialsCh32()
}
struct Essentials32: View {
var body: some View {
VStack{
TabView {
Essentials32ContentsView()
.tabItem {
Image(systemName: contentsImageTab)
Text(contentsTextTab)
}
Essentials32Code()
.tabItem {
Image(systemName: codeImageTab)
Text(codeTextTab)
}
Essentials32Points()
.tabItem {
Image(systemName: pointImageTab)
Text(pointTextTab)
}
Essentials32WEB()
.tabItem {
Image(systemName: webImageTab)
Text(webTextTab)
}
}
}
}
}
#Preview {
Essentials32()
}
struct Essentials32Code: View {
var body: some View {
ScrollView{
Text(codeEssentials32)
}
}
}
#Preview {
Essentials32Code()
}
struct Essentials32Points: View {
var body: some View {
ScrollView{
Text(pointEssentials32)
}
}
}
#Preview {
Essentials32Points()
}
struct Essentials32WebView: UIViewRepresentable {
let searchURL: URL
func makeUIView(context: Context) -> WKWebView {
let view = WKWebView()
let request = URLRequest(url: searchURL)
view.load(request)
return view
}
func updateUIView(_ uiView: WKWebView, context: Context) {
}
}
struct Essentials32WEB: View {
private var url:URL = URL(string: urlEssentials32)!
var body: some View {Essentials32WebView(searchURL: url)
}
}
#Preview {
Essentials32WEB()
}
struct Essentials32ContentsView: View {
@State private var flavors = ["青い","普通","完熟"]
@State private var selectedFlavor: String?
@State private var columnVisibility = NavigationSplitViewVisibility.doubleColumn
var body: some View {
NavigationSplitView(columnVisibility:$columnVisibility){
List(flavors, id: \.self,selection: $selectedFlavor){ flavor in
Text(flavor).tag(flavor)
}
.navigationSplitViewColumnWidth(150)
}detail: {
Text(selectedFlavor ?? "風味を選択")
}
.navigationSplitViewStyle(.prominentDetail)
}
}
#Preview {
Essentials32ContentsView()
}
◾️EssentialsMenu.swift
//フレームワーク
import SwiftUI
import WebKit
//ビュー管理構造体
struct ListiOSApp17DevelopmentEssentials: Identifiable {
var id: Int
var title: String
var view: ViewEnumiOSApp17DevelopmentEssentials
}
//遷移先の画面を格納する列挙型
enum ViewEnumiOSApp17DevelopmentEssentials {
case Ch1
//じっくり13で追加
case Ch2
//じっくり14で追加
case Ch3
//じっくり15で追加
case Ch4
//じっくり16で追加
case Ch5
//じっくり17で追加
case Ch6
//じっくり18で追加
case Ch7
//じっくり19で追加
case Ch8
//じっくり20、21で追加
case Ch9
//じっくり22、23で追加
case Ch10
//じっくり24で追加
case Ch11
//じっくり25で追加
case Ch12
//じっくり26で追加
case Ch13
//じっくり27,28で追加
case Ch14
//じっくり29で追加
case Ch15
//じっくり31で追加
case Ch16
//じっくり32で追加
case Ch17
//じっくり33で追加
case Ch18
//じっくり34で追加
case Ch19
//じっくり35で追加
case Ch20
//じっくり36で追加
case Ch21
//じっくり37で追加
case Ch22
//じっくり40で追加
case Ch23
//じっくり41で追加
case Ch24
//じっくり43で追加
case Ch25
//じっくり44で追加
case Ch26
//じっくり45で追加
case Ch27
//じっくり46で追加
case Ch28
//じっくり47で追加
case Ch29
//じっくり48で追加
case Ch30
//じっくり49で追加
case Ch31
//じっくり50で追加
case Ch32
}
//各項目に表示する文字列
let dataiOSApp17DevelopmentEssentials: [ListiOSApp17DevelopmentEssentials] = [
ListiOSApp17DevelopmentEssentials(id: 1, title: essentialsChapter1Title, view: .Ch1),
//じっくり13で追加
ListiOSApp17DevelopmentEssentials(id: 2, title: essentialsChapter2Title, view: .Ch2),
//じっくり13で追加
ListiOSApp17DevelopmentEssentials(id: 3, title: essentialsChapter3Title, view: .Ch3),
//じっくり15で追加
ListiOSApp17DevelopmentEssentials(id: 4, title: essentialsChapter4Title, view: .Ch4),
//じっくり16で追加
ListiOSApp17DevelopmentEssentials(id: 5, title: essentialsChapter5Title, view: .Ch5),
//じっくり17で追加
ListiOSApp17DevelopmentEssentials(id: 6, title: essentialsChapter6Title, view: .Ch6),
//じっくり18で追加
ListiOSApp17DevelopmentEssentials(id: 7, title: essentialsChapter7Title, view: .Ch7),
//じっくり19で追加
ListiOSApp17DevelopmentEssentials(id: 8, title: essentialsChapter8Title, view: .Ch8),
//じっくり20、21で追加
ListiOSApp17DevelopmentEssentials(id: 9, title: essentialsChapter9Title, view: .Ch9),
//じっくり22、23で追加
ListiOSApp17DevelopmentEssentials(id: 10, title: essentialsChapter10Title, view: .Ch10),
//じっくり24で追加
ListiOSApp17DevelopmentEssentials(id: 11, title: essentialsChapter11Title, view: .Ch11),
//じっくり25で追加
ListiOSApp17DevelopmentEssentials(id: 12, title: essentialsChapter12Title, view: .Ch12),
//じっくり26で追加
ListiOSApp17DevelopmentEssentials(id: 13, title: essentialsChapter13Title, view: .Ch13),
//じっくり27,28で追加
ListiOSApp17DevelopmentEssentials(id: 14, title: essentialsChapter14Title, view: .Ch14),
//じっくり29で追加
ListiOSApp17DevelopmentEssentials(id: 15, title: essentialsChapter15Title, view: .Ch15),
//じっくり31で追加
ListiOSApp17DevelopmentEssentials(id: 16, title: essentialsChapter16Title, view: .Ch16),
//じっくり32で追加
ListiOSApp17DevelopmentEssentials(id: 17, title: essentialsChapter17Title, view: .Ch17),
//じっくり33で追加
ListiOSApp17DevelopmentEssentials(id: 18, title: essentialsChapter18Title, view: .Ch18),
//じっくり34で追加
ListiOSApp17DevelopmentEssentials(id: 19, title: essentialsChapter19Title, view: .Ch19),
//じっくり35で追加
ListiOSApp17DevelopmentEssentials(id: 20, title: essentialsChapter20Title, view: .Ch20),
//じっくり36で追加
ListiOSApp17DevelopmentEssentials(id: 21, title: essentialsChapter21Title, view: .Ch21),
//じっくり37で追加
ListiOSApp17DevelopmentEssentials(id: 22, title: essentialsChapter22Title, view: .Ch22),
//じっくり40で追加
ListiOSApp17DevelopmentEssentials(id: 23, title: essentialsChapter23Title, view: .Ch23),
//じっくり41で追加
ListiOSApp17DevelopmentEssentials(id: 24, title: essentialsChapter24Title, view: .Ch24),
//じっくり43で追加
ListiOSApp17DevelopmentEssentials(id: 25, title: essentialsChapter25Title, view: .Ch25),
//じっくり44で追加
ListiOSApp17DevelopmentEssentials(id: 26, title: essentialsChapter26Title, view: .Ch26),
//じっくり45で追加
ListiOSApp17DevelopmentEssentials(id: 27, title: essentialsChapter27Title, view: .Ch27),
//じっくり46で追加
ListiOSApp17DevelopmentEssentials(id: 28, title: essentialsChapter28Title, view: .Ch28),
//じっくり47で追加
ListiOSApp17DevelopmentEssentials(id: 29, title: essentialsChapter29Title, view: .Ch29),
//じっくり48で追加
ListiOSApp17DevelopmentEssentials(id: 30, title: essentialsChapter30Title, view: .Ch30),
//じっくり49で追加
ListiOSApp17DevelopmentEssentials(id: 31, title: essentialsChapter31Title, view: .Ch31),
//じっくり50で追加
ListiOSApp17DevelopmentEssentials(id: 32, title: essentialsChapter32Title, view: .Ch32),
]
struct iOSApp17DevelopmentEssentials: View {
var body: some View {
VStack {
Divider()
List (dataiOSApp17DevelopmentEssentials) { data in
self.containedViewiOSApp17DevelopmentEssentials(dataiOSApp17DevelopmentEssentials: data)
}
.edgesIgnoringSafeArea([.bottom])
}
.navigationTitle("iOS開発の章目次")
.navigationBarTitleDisplayMode(.inline)
}
//タップ後に遷移先へ遷移させる関数
func containedViewiOSApp17DevelopmentEssentials(dataiOSApp17DevelopmentEssentials: ListiOSApp17DevelopmentEssentials) -> AnyView {
switch dataiOSApp17DevelopmentEssentials.view {
case .Ch1:
return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh1()) {
Text(dataiOSApp17DevelopmentEssentials.title)
})
//じっくり13で追加
case .Ch2:
return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh2()) {
Text(dataiOSApp17DevelopmentEssentials.title)
})
//じっくり13で追加
case .Ch3:
return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh3()) {
Text(dataiOSApp17DevelopmentEssentials.title)
})
//じっくり15で追加
case .Ch4:
return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh4()) {
Text(dataiOSApp17DevelopmentEssentials.title)
})
//じっくり16で追加
case .Ch5:
return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh5()) {
Text(dataiOSApp17DevelopmentEssentials.title)
})
//じっくり17で追加
case .Ch6:
return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh6()) {
Text(dataiOSApp17DevelopmentEssentials.title)
})
//じっくり18で追加
case .Ch7:
return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh7()) {
Text(dataiOSApp17DevelopmentEssentials.title)
})
//じっくり19で追加
case .Ch8:
return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh8()) {
Text(dataiOSApp17DevelopmentEssentials.title)
})
//じっくり20、21で追加
case .Ch9:
return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh9()) {
Text(dataiOSApp17DevelopmentEssentials.title)
})
//じっくり22、23で追加
case .Ch10:
return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh10()) {
Text(dataiOSApp17DevelopmentEssentials.title)
})
//じっくり24で追加
case .Ch11:
return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh11()) {
Text(dataiOSApp17DevelopmentEssentials.title)
})
//じっくり25で追加
case .Ch12:
return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh12()) {
Text(dataiOSApp17DevelopmentEssentials.title)
})
//じっくり26で追加
case .Ch13:
return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh13()) {
Text(dataiOSApp17DevelopmentEssentials.title)
})
//じっくり27,28で追加
case .Ch14:
return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh14()) {
Text(dataiOSApp17DevelopmentEssentials.title)
})
//じっくり29で追加
case .Ch15:
return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh15()) {
Text(dataiOSApp17DevelopmentEssentials.title)
})
//じっくり31で追加
case .Ch16:
return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh16()) {
Text(dataiOSApp17DevelopmentEssentials.title)
})
//じっくり32で追加
case .Ch17:
return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh17()) {
Text(dataiOSApp17DevelopmentEssentials.title)
})
//じっくり33で追加
case .Ch18:
return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh18()) {
Text(dataiOSApp17DevelopmentEssentials.title)
})
//じっくり34で追加
case .Ch19:
return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh19()) {
Text(dataiOSApp17DevelopmentEssentials.title)
})
//じっくり35で追加
case .Ch20:
return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh20()) {
Text(dataiOSApp17DevelopmentEssentials.title)
})
//じっくり36で追加
case .Ch21:
return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh21()) {
Text(dataiOSApp17DevelopmentEssentials.title)
})
//じっくり37で追加
case .Ch22:
return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh22()) {
Text(dataiOSApp17DevelopmentEssentials.title)
})
//じっくり40で追加
case .Ch23:
return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh23()) {
Text(dataiOSApp17DevelopmentEssentials.title)
})
//じっくり41で追加
case .Ch24:
return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh24()) {
Text(dataiOSApp17DevelopmentEssentials.title)
})
//じっくり43で追加
case .Ch25:
return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh25()) {
Text(dataiOSApp17DevelopmentEssentials.title)
})
//じっくり44で追加
case .Ch26:
return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh26()) {
Text(dataiOSApp17DevelopmentEssentials.title)
})
//じっくり45で追加
case .Ch27:
return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh27()) {
Text(dataiOSApp17DevelopmentEssentials.title)
})
//じっくり46で追加
case .Ch28:
return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh28()) {
Text(dataiOSApp17DevelopmentEssentials.title)
})
//じっくり47で追加
case .Ch29:
return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh29()) {
Text(dataiOSApp17DevelopmentEssentials.title)
})
//じっくり48で追加
case .Ch30:
return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh30()) {
Text(dataiOSApp17DevelopmentEssentials.title)
})
//じっくり49で追加
case .Ch31:
return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh31()) {
Text(dataiOSApp17DevelopmentEssentials.title)
})
//じっくり50で追加
case .Ch32:
return AnyView(NavigationLink (destination: iOSApp17DevelopmentEssentialsCh32()) {
Text(dataiOSApp17DevelopmentEssentials.title)
})
}
}
}
#Preview {
iOSApp17DevelopmentEssentials()
}
以上。
さてと、後は今日も、
温泉と新聞、寝落ちるまで文藝春秋でまったり過ごそ🕺
明日からも仕事楽しも💃
では、皆さんも残り少ないけど、良き週末を〜〜〜
この記事が気に入ったらサポートをしてみませんか?