А как ты им пользуешься?

Apple выпустила SwiftUI для создания пользовательских интерфейсов на всех платформах Apple с использованием возможностей Swift. Прежде чем я покажу вам, что мы будем строить в этой статье, позвольте мне объяснить одну из наиболее важных концепций разработки SwiftUI: @Binding.

Примечание. Прежде чем приступить к @Binding, я настоятельно рекомендую вам прочитать мою @State статью, так как использование @Binding требует знания @State.

Что такое @Binding?

Представление в SwiftUI может содержать несколько дочерних представлений. Возможно, вы захотите связаться с этими дочерними представлениями или захотите, чтобы дочернее представление изменило значение своего родительского. С помощью @Binding вы можете передать значение @State variable из родительского представления в дочернее представление, и если дочернее представление изменяет, мутирует или изменяет значение @State, родительский элемент автоматически получит обновленное значение и повторно отобразит представление. Это означает, что вы можете обновить родительское представление из дочернего представления, просто изменив значение переменной @State родительского представления в дочернем представлении с помощью @Binding.

Давайте посмотрим, как использовать переменную @Binding в XCode.

Настраивать

Чтобы создать проект, в XCode выберите: «File» ›« New »› «Project» ›« Single View App »› «Next» ›« Select User Interface »› «SwiftUI» ›« Next »› выберите место, где вы хочу сохранить этот проект ›« Готово »

ContentView.swift

По умолчанию SwiftUI(ContentView) предлагает следующий код:

import SwiftUI
struct ContentView: View {
var body: some View {
    Text(”Hello World!”)
  }
}
struct ContentView_Previews: PreviewProvider {  
static var previews: some View {
     ContentView()
   }
}

Справа вы можете увидеть предварительный просмотр пользовательского интерфейса. Если вы не видите предварительный просмотр, перейдите в «Параметры редактора настройки» в правом верхнем углу и выберите «Холст» или нажмите «Option + Command + Enter ». Затем убедитесь, что на холсте отображается предварительный просмотр пользовательского интерфейса.

Создание пользовательского интерфейса

Определите вертикальный стек внутри тела ContentView. Он будет содержать Text и Plus Onebutton.

Код:

VStack {
   Text("Hello World!")
   Button("Plus One"){
      //Action Goes Here
   }
}

Для окончательного вывода мы хотим настроить размер шрифта текста, размер шрифта кнопки, цвет фона, цвет текста и сделать края кнопки круглыми.

Сначала мы изменяем код кнопки, чтобы получить доступ к свойству кнопки Text. После модификации код будет выглядеть примерно так:

VStack{
   Text(”Hello World!”)
   Button(action: {
   //Button action goes here
   }){
      Text(“Plus One”)
     }
}

Теперь давайте посмотрим на свойства, которые мы будем использовать для достижения желаемого результата.

Мы можем изменить размер шрифта с помощью свойства .font():

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

Мы можем изменить цвет фона с помощью свойства .background(Color.COLOR_NAME):

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

Чтобы изменить цвет текста, мы можем использовать свойство .foregroundColor(Color.COLOR_NAME):

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

Чтобы края были круглыми, мы можем использовать свойство .cornerRadius(CORNER_RADIUS_VALUE):

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

Если мы применим все вышеперечисленные свойства к тексту и кнопке соответствующим образом, наш код будет выглядеть так:

//Vertical Stack
VStack {
   //Text containing current value
   Text("Hello World")
      .font(.largeTitle)  // Font type or size
      .fontWeight(.bold)  // Font style
   
   Button(action: {
         //Button on click action goes here
      }){
      
      //Button Text a& its properties
      Text("Plus One")
         .font(.title)   // Font type or size
         .fontWeight(.bold)  // Font style
         .foregroundColor(Color.white) // Text Color
         .padding(16)    // Padding to the button
         .background(Color.orange) // Background color of the button
         .cornerRadius(10)   // Corner radius to make edges circular
      }
}

И вот такой вывод:

Теперь, когда наш пользовательский интерфейс готов, давайте посмотрим, как реализовать @Binding.

Объявите переменную @State

Теперь мы объявляем переменную @State. Чтобы объявить переменную @State, мы должны использовать ключевое слово @State перед объявлением переменной. Проверьте строку ниже, чтобы лучше понять, как объявлять переменные@State.

@State var currentValue = 0

Теперь мы установим значение переменной @State в Text. Код Text теперь выглядит так:

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

Мы хотим изменять значение переменной @State всякий раз, когда пользователь нажимает кнопку. Для этого нам нужно изменить значение переменной внутри блока Button ACTION . Чтобы получить доступ к переменной @State внутри метода button ACTION, нам нужно определить self.STATE_VARIABLE_NAME , чтобы он выглядел примерно так:

self.currentValue += 1

Когда пользователь нажимает кнопку, изменяется значение переменной @State. Когда значение переменной @State изменяется, он снова отображает представление и изменяет отображаемое текстовое значение.

Весь код выглядит так:

//
//  ContentView.swift
//  State-Demo
//
//  Created by Mayur on 14/10/19.
//  Copyright © 2019 Mayur Rathod. All rights reserved.
//
import SwiftUI
struct ContentView: View {
    
   @State var currentValue = 0
   
   var body: some View {
   //Vertical Stack
   VStack {
      //Text containing current value
      Text("\(currentValue)")
         .font(.largeTitle)  // Font type or size
         .fontWeight(.bold)  // Font style
Button(action: {
       //Button on click action goes here
       self.currentValue += 1
   }){
      //Button Text a& its properties
      Text("Plus One")
         .font(.title)   // Font type or size
         .fontWeight(.bold)  // Font style
         .foregroundColor(Color.white) // Text Color
         .padding(16)    // Padding to the button
         .background(Color.orange) // Background color of the button
         .cornerRadius(10)   // Corner radius to make edges circular
   }
  }
}
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

Создать интерфейс дочернего представления

Теперь давайте создадим еще один файл SwiftUI, который будет дочерним представлением ContentView. Назовем этот файл BindingView.swift. Код будет примерно таким:

import SwiftUI
struct BindingView: View {
var body: some View {
    Text(”Hello World!”)
  }
}
struct BindingView_Previews: PreviewProvider {  
static var previews: some View {
     BindingView()
   }
}

Требуемый пользовательский интерфейс для theBindingView показан ниже. Нам нужно создать одну кнопку с текстом «Минус один », которая идентична кнопке, которую мы создали в родительском представлении, ContentView.swift.

Код:

var body: some View {
   VStack {
      Button(action: {
         //Button action goes here
      }){
         Text(“Minus One”)
            .font(.title)
            .fontWeight(.bold)
            .foregroundColor(Color.white) 
            .padding(16)
            .background(Color.blue)
            .cornerRadius(10)
        }
    }
}

Объявите переменную @Binding

Теперь мы создадим переменную @Binding. Для этого мы должны использовать ключевое слово @Binding перед объявлением переменной.

Переменная @Binding должна быть объявлена ​​вне тела представления:

@Binding var valueFromParent : Int

Мы хотим изменять значение переменной @Binding всякий раз, когда пользователь нажимает кнопку. Для этого нам теперь нужно изменить значение переменной внутри блока Button ACTION . Определите self.BINDING_VARIABLE_NAME так, чтобы он выглядел примерно так:

self.valueFromParent -= 1

Поэтому, когда пользователь нажимает кнопку «Минус один» в дочернем представлении, мы уменьшаем значение на единицу. Как только мы это сделаем, он снова отобразит родительское представление, показывающее последнее значение после декремента.

Код:

import SwiftUI
struct BindingView: View {
   @Binding var valueFromParent : Int
   
   var body: some View {
      VStack {
         Button(action: {
            self.valueFromParent -= 1
      }){
          Text(“Minus One”)
             .font(.title)
             .fontWeight(.bold)
             .foregroundColor(Color.white)
             .padding(16)
             .background(Color.blue)
             .cornerRadius(10)
         }
      }
   }
}
struct BindingView_Previews: PreviewProvider {
   static var previews: some View {
       BindingView(valueFromParent: .constant(0))
   }
}

Родительское представление будет отображаться снова, если мы изменим значение в дочернем представлении.

Поскольку мы будем передавать переменную @State в качестве параметра дочернему представлению из родительского представления, дочернее представление изменит значение переменной @Binding. Это эквивалентно изменению значения переменной @State в родительском представлении и, согласно определению переменной@State, всякий раз, когда мы изменяем значение переменной @State, представление будет отображаться снова.

Конечный продукт

Полный код выглядит так:

Родительское представление, то есть ContentView.swift:

import SwiftUI
struct ContentView: View {
   @State var currentValue = 0
   
   var body: some View {
   //Vertical Stack
   VStack {
      //Text containing current value
      Text(“\(currentValue)”)
         .font(.largeTitle) // Font type or size
         .fontWeight(.bold) // Font style
      Button(action: {
         //Button on click action goes here
         self.currentValue += 1
      }){
       //Button Text a& its properties
       Text(“Plus One”)
         .font(.title) // Font type or size
         .fontWeight(.bold) // Font style
         .foregroundColor(Color.white) // Text Color
         .padding(16) // Padding to the button
         .background(Color.orange) // Background color of the button
         .cornerRadius(10) // Corner radius to make edges circular
      }
     
       //Child View
       BindingView(valueFromParent: $currentValue)
    }
   }
}
struct ContentView_Previews: PreviewProvider {
   static var previews: some View {
     ContentView()
   }
}

Дочернее представление или BindingView.swift:

import SwiftUI
struct BindingView: View {
   @Binding var valueFromParent : Int
      var body: some View {
      VStack {
         Button(action: {
            self.valueFromParent -= 1
         }){
         Text(“Minus One”)
          .font(.title)
          .fontWeight(.bold)
          .foregroundColor(Color.white)
          .padding(16)
          .background(Color.blue)
          .cornerRadius(10)
         }
      }
   }
}
struct BindingView_Previews: PreviewProvider {
   static var previews: some View {
      BindingView(valueFromParent: .constant(0))
   }
}