ساخت یک نمای Modal با SwiftUI — از صفر تا صد
SwiftUI فریمورک جدیدی است که موجب تسریع زیادی در فرایند توسعه اپلیکیشن میشود. این فریمورک از سوی اپل در خرداد سال 1398 معرفی شده است. در این مقاله در مورد ساخت یک نمای Modal با SwiftUI صحبت خواهیم کرد.
در حال حاضر یک پکیج متن-باز در اختیار همه افراد قرار گرفته است تا نماهای Modal را به روشی آسان نمایش دهند. با این حال این وضعیت به زودی عوض خواهد شد. این کتابخانه را میتوان به صورت یک پکیج Swift به پروژه اضافه کرد و از بهروزرسانیها بهرهمند شد و یا در صورتی که کارکرد آن برای همه حالتهای مختلفی که هماینک در پروژه دارید کفایت میکند، میتوانید فایل آن را به پروژه کپی کنید.
گام 1: افزودن کتابخانه ModalView به عنوان یک پکیج Swift در Xcode
کتابخانه 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}
گام 3: افزودن ModalLink به صورت مشابه NavigationLink
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}
نتیجه کار چنین است:
در سلسلهمراتبهای پیچیده مانند نمای ناوبری با یک فرم و دکمههای مختلف، استفاده از نمای ModalPresenter عملکرد بهمراتب بهتری در مقایسه با API پیشفرض نشان میدهد.
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 باعث کاهش امنیت کد شده است. با این حال این یک مشکل جدی محسوب نمیشود، مشکل جدی این است که هر کدام از دکمهها در این کد تنها یک بار کار میکنند. دلیل آن را خودتان بررسی کنید.
سخن پایانی
استفاده از کتابخانه جدید ModalView در پروژهها ایده خوبی به نظر میرسد، زیرا این فریمورک، API نسبتاً سادهتری ارائه میکند و تجربه کدنویسی سرعت بیشتری مییابد. اگر با حالتهای خاصی مواجه شدهاید، میتوانید در این آدرس (+) به این کتابخانه درخواست pull و issue بدهید.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی
- آموزش برنامه نویسی Swift (سوئیفت) برای برنامه نویسی iOS
- مجموعه آموزشهای دروس علوم و مهندسی کامپیوتر
- آموزش سوئیفت (Swift) — مجموعه مقالات مجله فرادرس
- عملگرهای سفارشی در سوئیفت — از صفر تا صد
==