آشنایی با Binding@ در SwiftUI – به زبان ساده

۲۰۱
۱۴۰۲/۰۶/۱۸
۶ دقیقه
PDF
آشنایی با Binding@ در SwiftUI – به زبان سادهآشنایی با Binding@ در SwiftUI – به زبان ساده
آموزش متنی جامع
امکان دانلود نسخه PDF

اپل SwiftUI را برای ساخت رابط‌های کاربری بر روی همه پلتفرم‌های مختص خودش با بهره‌گیری از سوئیفت معرفی کرده است. پیش از آن که در مورد آن چه در این مقاله می‌خواهیم بسازیم صحبت کنیم، ابتدا به توضیح یکی از مهم‌ترین جنبه‌های توسعه SwiftUI یعنی Binding@ می‌پردازیم.

997696

نکته: پیش از این که به مطالعه در مورد Binding@ بپردازید، پیشنهاد می‌کنیم به طور کامل در مورد State@ به مطالعه بپردازید، چون استفاده از Binding@ نیازمند کسب دانشی در مورد State@ است.

Binding@ چیست؟

View در SwiftUI می‌تواند شامل چند view فرزند باشد. ممکن است بخواهید با آن نماهای فرزند ارتباط بگیرید یا بخواهید یکی از نماهای فرزند مقدار والد خود را تغییر دهد. با استفاده از Binding@ می‌توانید مقدار متغیر State@ را از نمای والد به نمای فرزند ارسال کنید و در صورتی که نمای فرزند اقدام به دستکاری یا تغییر دادن مقدار State@ کند، والد به صورت خودکار مقدار را به‌روزرسانی کرده و نما را رندر مجدد می‌کند. این بدان معنی است که می‌توانید نمای والد را از روی نمای فرزند و صرفاً با تغییر دادن مقدار متغیر State@ نمای والد در نمای فرزند و با کمک گرفتن از Binding@ به‌روزرسانی کنید.

در ادامه شیوه استفاده از متغیر Binding@ را در XCode بررسی می‌کنیم.

راه‌اندازی

برای ایجاد پروژه در Xcode باید مسیر زیر را طی کنید:

“File” > “New” > “Project” > “Single View App” > “Next” > “Select User Interface” > “SwiftUI” > “Next” >

پس از انتخاب مکان ذخیره‌سازی پروژه روی Done کلیک کنید.

فایل ContentView.swift

ContentView.swift به صورت پیش‌فرض با کد زیر عرضه می‌شود:

1import SwiftUI
2struct ContentView: View {
3var body: some View {
4    Text(”Hello World!)
5  }
6}
7struct ContentView_Previews: PreviewProvider {  
8static var previews: some View {
9     ContentView()
10   }
11}

از سوی دیگر می‌توانید پیش‌نمایشی از UI را ببینید. اگر این پیش‌نمایش را نمی‌بینید، در سمت راست به مسیر Adjust Editor Option بروید و گزینه Canvas را انتخاب کنید و یا کلیدهای Option+Command+Enter را بزنید. بدین ترتیب مطمئن می‌شوید که بوم در حال نشان دادن پیش‌نمایشی از UI است.

Binding

ایجاد یک رابط کاربری

«پشته افقی» (Vertical stack) را درون بدنه ContentView تعریف می‌کنیم. این پشته شامل Text و دکمه Plus One خواهد بود.

Binding

کد آن به صورت زیر است:

1VStack {
2   Text("Hello World!")
3   Button("Plus One"){
4      //Action Goes Here
5   }
6}

در خروجی نهایی می‌خواهیم اندازه فونت متن، اندازه فونت دکمه، رنگ پس‌زمینه و رنگ متن را سفارشی‌سازی کنیم و لبه‌های دکمه را گرد نماییم. ابتدا کد دکمه را تغییر می‌دهیم به طوری می‌توانیم به مشخصه Text دکمه دسترسی پیدا کنیم. پس از این تغییر، کد به صورت زیر درمی‌آید:

1VStack{
2   Text(”Hello World!)
3   Button(action: {
4   //Button action goes here
5   }){
6      Text(“Plus One”)
7     }
8}

اکنون نگاهی به مشخصه‌هایی می‌اندازیم که برای رسیدن به خروجی مطلوبمان مورد استفاده قرار خواهیم داد. می‌توانیم اندازه فونت را با استفاده از مشخصه ()font. به صورت زیر تغییر دهیم:

1Text("Hello World")
2   .font(.largeTitle) // Font type

رنگ پس‌زمینه را با استفاده از مشخصه background(Color.COLOR_NAME). تغییر می‌دهیم:

1Text(“Hello World”) // Button Text
2   .background(Color.orange) // Button Background Color

برای تغییر دادن رنگ پس‌زمینه می‌توانیم از مشخصه foregroundColor(Color.COLOR_NAME). استفاده کنیم:

1Text(“Hello World”) // Button Text
2   .foregroundColor(Color.white) // Button text color

برای گرد ساختن گوشه‌ها می‌توانیم از مشخصه.cornerRadius(CORNER_RADIUS_VALUE) استفاده کنیم:

1Text(“Hello World”) // Button Text
2   .cornerRadius(10.0) // Button corner radius property

اگر همه مشخصه‌های فوق را روی متن و دکمه به صورت صحیحی اعمال کنید، کدتان مانند زیر خواهد بود:

1//Vertical Stack
2VStack {
3   //Text containing current value
4   Text("Hello World")
5      .font(.largeTitle)  // Font type or size
6      .fontWeight(.bold)  // Font style
7   
8   Button(action: {
9         //Button on click action goes here
10      }){
11      
12      //Button Text a& its properties
13      Text("Plus One")
14         .font(.title)   // Font type or size
15         .fontWeight(.bold)  // Font style
16         .foregroundColor(Color.white) // Text Color
17         .padding(16)    // Padding to the button
18         .background(Color.orange) // Background color of the button
19         .cornerRadius(10)   // Corner radius to make edges circular
20      }
21}
مشاهده کامل کدها

اینک خروجی به صورت زیر درمی‌آید:

Binding

اکنون که UI ما آماده است، به بررسی شیوه پیاده‌سازی Binding@ می‌پردازیم.

اعلان متغیر State@

در این مرحله متغیر State@ را اعلان می‌کنیم. برای اعلان متغیر State@ باید کلیدواژه State@ را پیش از اعلان کردن متغیر بیاوریم. با نگاه کردن به خط زیر درک بهتری از شیوه اعلان متغیرهای State@ به دست می‌آورید:

1State@ var currentValue = 0

اکنون مقدار متغیر State@ را با استفاده از Text تعیین خواهیم کرد. کد Text اکنون به صورت زیر درآمده است:

1Text(“\(currentValue))
2   .font(.largeTitle) // Font type or size
3   .fontWeight(.bold) // Font style

ما می‌خواهیم مقدار متغیر State@ را هر زمان که کاربر روی دکمه کلیک می‌کند تغییر دهیم. به این منظور باید مقدار متغیر درون بلوک Button ACTION را تغییر دهیم. برای دسترسی به متغیر State@ درون متد button ACTION باید self.STATE_VARIABLE_NAME را طوری تعریف کنیم که به صورت زیر دربیاید:

1self.currentValue += 1

زمانی که کاربر روی دکمه کلیک کند، مقدار متغیر State@ تغییر پیدا می‌کند. هنگامی که مقدار متغیر State@ تغییر پیدا کند، نما مجدداً رند می‌شود و تغییرها در مقدار متن نمایش پیدا می‌کند. اینک کل کد به صورت زیر درآمده است:

1//
2//  ContentView.swift
3//  State-Demo
4//
5//  Created by Mayur on 14/10/19.
6//  Copyright © 2019 Mayur Rathod. All rights reserved.
7//
8import SwiftUI
9struct ContentView: View {
10    
11   @State var currentValue = 0
12   
13   var body: some View {
14   //Vertical Stack
15   VStack {
16      //Text containing current value
17      Text("\(currentValue)")
18         .font(.largeTitle)  // Font type or size
19         .fontWeight(.bold)  // Font style
20Button(action: {
21       //Button on click action goes here
22       self.currentValue += 1
23   }){
24      //Button Text a& its properties
25      Text("Plus One")
26         .font(.title)   // Font type or size
27         .fontWeight(.bold)  // Font style
28         .foregroundColor(Color.white) // Text Color
29         .padding(16)    // Padding to the button
30         .background(Color.orange) // Background color of the button
31         .cornerRadius(10)   // Corner radius to make edges circular
32   }
33  }
34}
35struct ContentView_Previews: PreviewProvider {
36    static var previews: some View {
37        ContentView()
38    }
39}
مشاهده کامل کدها

ایجاد اینترفیس نمای فرزند

در این بخش فایل SwiftUI دیگری ایجاد می‌کنیم که نمای فرزند ContentView خواهد بود. نام آن را BindingView.swift می‌گذاریم. کد آن به صورت زیر است:

1import SwiftUI
2struct BindingView: View {
3var body: some View {
4    Text(”Hello World!)
5  }
6}
7struct BindingView_Previews: PreviewProvider {  
8static var previews: some View {
9     BindingView()
10   }
11}

UI موردنیاز برای BindingView در ادامه نمایش یافته است. ما باید یک دکمه با متن «Minus One» بسازیم که دقیقاً برابر با دکمه‌ای است که در نمای والد یعنی ContentView.swift ساخته‌ایم.

Binding

کد آن به صورت زیر است:

1var body: some View {
2   VStack {
3      Button(action: {
4         //Button action goes here
5      }){
6         Text(“Minus One”)
7            .font(.title)
8            .fontWeight(.bold)
9            .foregroundColor(Color.white) 
10            .padding(16)
11            .background(Color.blue)
12            .cornerRadius(10)
13        }
14    }
15}
مشاهده کامل کدها

اعلان متغیر Binding@

اکنون یک متغیر Binding@ ایجاد می‌کنیم. به این منظور باید از کلیدواژه Binding@ پیش از اعلان متغیر استفاده کنیم. متغیر Binding@ باید خارج از بدنه نما اعلان شود:

1Binding@ var valueFromParent: Int

ما می‌خواهیم مقدار متغیر Binding@ را هر زمان که کاربر روی دکمه کلیک می‌کند تغییر دهیم. به این منظور باید مقدار متغیر درون بلوک Button ACTION را تغییر دهیم. self.BINDING_VARIABLE_NAME را طوری تعریف می‌کنیم که به صورت زیر دربیاید:

1self.valueFromParent -= 1

بنابراین هر زمان که کاربر روی دکمه Minus One در نمای فرزند کلیک کند، مقدار آن یک واحد کاهش می‌یابد. به محض انجام این کار نمای والد را بار دیگر رندر خواهیم کرد تا آخرین مقدار را پس از کاهش نمایش دهد. کد آن به صورت زیر است:

1import SwiftUI
2struct BindingView: View {
3   @Binding var valueFromParent : Int
4   
5   var body: some View {
6      VStack {
7         Button(action: {
8            self.valueFromParent -= 1
9      }){
10          Text(“Minus One”)
11             .font(.title)
12             .fontWeight(.bold)
13             .foregroundColor(Color.white)
14             .padding(16)
15             .background(Color.blue)
16             .cornerRadius(10)
17         }
18      }
19   }
20}
21struct BindingView_Previews: PreviewProvider {
22   static var previews: some View {
23       BindingView(valueFromParent: .constant(0))
24   }
25}
مشاهده کامل کدها

نمای والد در صورتی که مقدار در نمای فرزند تغییر پیدا کند، مجدداً رندر خواهد شد.

نتیجه نهایی

در این بخش به برسی کد کامل می‌پردازیم.

کد موجود در فایل ContentView.swift به صورت زیر است:

1import SwiftUI
2struct ContentView: View {
3   @State var currentValue = 0
4   
5   var body: some View {
6   //Vertical Stack
7   VStack {
8      //Text containing current value
9      Text(“\(currentValue))
10         .font(.largeTitle) // Font type or size
11         .fontWeight(.bold) // Font style
12      Button(action: {
13         //Button on click action goes here
14         self.currentValue += 1
15      }){
16       //Button Text a& its properties
17       Text(“Plus One”)
18         .font(.title) // Font type or size
19         .fontWeight(.bold) // Font style
20         .foregroundColor(Color.white) // Text Color
21         .padding(16) // Padding to the button
22         .background(Color.orange) // Background color of the button
23         .cornerRadius(10) // Corner radius to make edges circular
24      }
25     
26       //Child View
27       BindingView(valueFromParent: $currentValue)
28    }
29   }
30}
31struct ContentView_Previews: PreviewProvider {
32   static var previews: some View {
33     ContentView()
34   }
35}
مشاهده کامل کدها

کد نمای فرزند یا BindingView.swift به صورت زیر است:

1import SwiftUI
2struct BindingView: View {
3   @Binding var valueFromParent : Int
4      var body: some View {
5      VStack {
6         Button(action: {
7            self.valueFromParent -= 1
8         }){
9         Text(“Minus One”)
10          .font(.title)
11          .fontWeight(.bold)
12          .foregroundColor(Color.white)
13          .padding(16)
14          .background(Color.blue)
15          .cornerRadius(10)
16         }
17      }
18   }
19}
20struct BindingView_Previews: PreviewProvider {
21   static var previews: some View {
22      BindingView(valueFromParent: .constant(0))
23   }
24}
مشاهده کامل کدها

بدین ترتیب به پایان این مقاله می‌رسیم.

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

==

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

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