Binding

https://developer.apple.com/documentation/swiftui/binding

TextField(_ titleKey: LocalizedStringKey, text: Binding<String>, ..)

Picker(_ titleKey: LocalizedStringKey, selection: Binding<SelectionValue>, ..)

Slider(value: Binding<BinaryFloatingPoint>, ..)

..

Kullandığımız temel bileşenlerin constructor'ına baktığımızda da dikkatimizi çekmiştir, argüman olarak Binding türünden parametreler beklenir.

Bu şu demek;

@State var text: String
TextField("Placeholder", text: $text)

Textfield için örneklendirelim, kullanıcı klavyeden tuşlara bastıkça yani TextField içindeki text düzenlendikçe, bizim text kısmına argüman olarak geçtiğimiz değer de otomatik olarak bizim için güncellenir yani bir nevi çift taraflı müdahaleye açık (two way connection). Bu senaryoyu UIKit ile yapmak isteseydik TextField ın valueChanged eventini manuel olarak dinlememiz gerekirdi, ama SwiftUI ile birlikte bu hizmeti ücretsiz olarak alabiliyoruz.

Parent View de bulunan bir @State değişkenini Child View içinde düzenlemek için, Child View de onu @Binding olarak işaretlemeliyiz.

struct PlayButton: View {
    @Binding var isPlaying: Bool
    
    var body: some View {
        Button(action: {
            self.isPlaying.toggle()
        }) {
            Image(systemName: isPlaying ? "pause.circle" : "play.circle")
        }
    }
}

struct PlayerView: View {
    var episode: Episode
    @State private var isPlaying: Bool = false
    
    var body: some View {
        VStack {
            Text(episode.title)
            Text(episode.showTitle)
            PlayButton(isPlaying: $isPlaying)
        }
    }
}

PlayButton a basıldığında, PlayerView isPlaying state değişkenini güncelliyor.

Last updated