ساخت یک نمای Modal با SwiftUI — از صفر تا صد

۴۵ بازدید
آخرین به‌روزرسانی: ۱۸ شهریور ۱۴۰۲
زمان مطالعه: ۳ دقیقه
ساخت یک نمای Modal با SwiftUI — از صفر تا صد

SwiftUI فریمورک جدیدی است که موجب تسریع زیادی در فرایند توسعه اپلیکیشن می‌شود. این فریمورک از سوی اپل در خرداد سال 1398 معرفی شده است. در این مقاله در مورد ساخت یک نمای Modal با SwiftUI صحبت خواهیم کرد.

997696

در حال حاضر یک پکیج متن-باز در اختیار همه افراد قرار گرفته است تا نماهای Modal را به روشی آسان نمایش دهند. با این حال این وضعیت به زودی عوض خواهد شد. این کتابخانه را می‌توان به صورت یک پکیج Swift به پروژه اضافه کرد و از به‌روزرسانی‌ها بهره‌مند شد و یا در صورتی که کارکرد آن برای همه حالت‌های مختلفی که هم‌اینک در پروژه دارید کفایت می‌کند، می‌توانید فایل آن را به پروژه کپی کنید.

گام 1: افزودن کتابخانه ModalView به عنوان یک پکیج Swift در Xcode

نمای Modal با SwiftUI

کتابخانه ModalView را می‌توانید از این آدرس (+) دریافت کنید. ما برای معرفی این کتابخانه از یک قیاس با API ناوبری موجود کمک می‌گیریم:

  • ModalPresenter مشابه toNavigationView است.
  • ModalLink مشابه NavigationLink است.

از این رو API مربوط به modal برای هر کسی که قبلاً با ناوبری در پروژه‌های سوئیفت سروکار داشته است آشنا خواهد بود.

گام 2: ایجاد ModalPresenter به روشی مشابه NavigationView

در ابتدا ModalPresenter را جایی در پروژه در نزدیکی ریشه‌ی نما-(View)-ی خود اضافه می‌کنیم. این محل لازم نیست حتماً root باشد فقط کافی است مطمئن شوید که درون List ،Form یا نماهای مشابهی که نماهای فرعی را به روش دینامیک ایجاد می‌کنند قرار ندارد.

1import SwiftUI
2import ModalView
3
4struct ContentView: View {
5    var body: some View {
6        ModalPresenter {
7            Text("Hello")
8        }
9    }
10}

Text را که قرار است نمای modal را راه‌اندازی کند، درون NavigationLink قرار می‌دهیم.

1...
2struct ContentView: View {
3    var body: some View {
4        ModalPresenter {
5            ModalLink(destination: Text("?")) {
6                Text("Hello")
7            }
8        }
9    }
10}

نتیجه کار چنین است:

ساخت یک نمای Modal با SwiftUI

در سلسله‌مراتب‌های پیچیده مانند نمای ناوبری با یک فرم و دکمه‌های مختلف، استفاده از نمای ModalPresenter عملکرد به‌مراتب بهتری در مقایسه با API پیش‌فرض نشان می‌دهد.

ساخت یک نمای Modal با SwiftUI

1struct ContentView: View {
2    var body: some View {
3        NavigationView {
4            ModalPresenter() {
5                Form {
6                    Section(header: Text("Animals")) {
7                        ModalLink(destination: Text("?")) {
8                            Text("Show ?")
9                        }
10                        ModalLink(destination: Text("?")) {
11                            Text("Show ?")
12                        }
13                        ModalLink(destination: Text("?")) {
14                            Text("Show ?")
15                        }
16                    }
17                    Section(header: Text("Plants")) {
18                        ModalLink(destination: Text("?")) {
19                            Text("Show ?")
20                        }
21                        ModalLink(destination: Text("?")) {
22                            Text("Show ?")
23                        }
24                        ModalLink(destination: Text("?")) {
25                            Text("Show ?")
26                        }
27                    }
28                }
29            }.navigationBarTitle("Actions")
30        }
31    }
32}

به طور خلاصه‌ای کتابخانه عملکرد کاملاً سرراستی دارد. اکنون به توضیح شیوه پیاده‌سازی آن بدون کتابخانه می‌پردازیم و بررسی می‌کنیم که با استفاده از آن در نماهای List و Form چه نتایج پنهانی به دست می‌آوریم.

نمایش نمای Modal بدون استفاده از کتابخانه ModalView

متد پیش‌فرض استفاده از یک API به نام sheet (+) است. یک sheet نیازمند اتصالی به یک مقدار بولی است که نمایش یا عدم نمایش کادر محاوره‌ای را کنترل می‌کند. ضمناً فراموش نکنید که این حالت باید با ضربه زدن روی دکمه تغییر یابد. در یک حالت ساده، نتیجه چیزی مانند زیر خواهد بود:

1struct ContentView: View {
2
3    @State var isPresented: Bool = false // Creating a state
4    var body: some View {
5        Button(action: { self.isPresented.toggle() }) { // Button to show the modal view by toggling the state
6            Text("Show ?")
7        }.sheet(isPresented: $isPresented) { // Passing the state to the sheet API
8            Text("?")
9        }
10    }
11
12}

بخش دشوار ماجرا در لیست آیتم‌ها است. آن را در ادامه بررسی می‌کنیم:

1struct ContentView: View {
2    @State var isPresented1: Bool = false
3    @State var isPresented2: Bool = false
4    @State var isPresented3: Bool = false
5    @State var isPresented4: Bool = false
6    @State var isPresented5: Bool = false
7    @State var isPresented6: Bool = false
8
9    var body: some View {
10        NavigationView {
11            Form {
12                Section(header: Text("Animals")) {
13                    Button(action: { self.isPresented1.toggle() }) {
14                        Text("Show ?")
15                    }.sheet(isPresented: $isPresented1) {
16                        Text("?")
17                    }
18                    Button(action: { self.isPresented2.toggle() }) {
19                        Text("Show ?")
20                    }.sheet(isPresented: $isPresented2) {
21                        Text("?")
22                    }
23                    Button(action: { self.isPresented3.toggle() }) {
24                        Text("Show ?")
25                    }.sheet(isPresented: $isPresented3) {
26                        Text("?")
27                    }
28                }
29                Section(header: Text("Plants")) {
30                    Button(action: { self.isPresented4.toggle() }) {
31                        Text("Show ?")
32                    }.sheet(isPresented: $isPresented4) {
33                        Text("?")
34                    }
35                    Button(action: { self.isPresented5.toggle() }) {
36                        Text("Show ?")
37                    }.sheet(isPresented: $isPresented5) {
38                        Text("?")
39                    }
40                    Button(action: { self.isPresented6.toggle() }) {
41                        Text("Show ?")
42                    }.sheet(isPresented: $isPresented6) {
43                        Text("?")
44                    }
45                }
46            }
47            .navigationBarTitle("Actions")
48        }
49    }
50}

اکنون احتمالاً ایده کلی کار را متوجه شده‌اید. کد طول زیادی دارد و امنیت آن پایین است چون نوشتن isPresented5 در یک محل و کپی کردن آن به محل دیگر به صورت isPresented6 باعث کاهش امنیت کد شده است. با این حال این یک مشکل جدی محسوب نمی‌شود، مشکل جدی این است که هر کدام از دکمه‌ها در این کد تنها یک بار کار می‌کنند. دلیل آن را خودتان بررسی کنید.

ساخت یک نمای Modal با SwiftUI

سخن پایانی

استفاده از کتابخانه جدید ModalView در پروژه‌ها ایده خوبی به نظر می‌رسد، زیرا این فریمورک، API نسبتاً ساده‌تری ارائه می‌کند و تجربه کدنویسی سرعت بیشتری می‌یابد. اگر با حالت‌های خاصی مواجه شده‌اید، می‌توانید در این آدرس (+) به این کتابخانه درخواست pull و issue بدهید.

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

بر اساس رای ۰ نفر
آیا این مطلب برای شما مفید بود؟
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.
منابع:
better-programming
نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *