Zihinsel Model Değişimi
UIKit’te navigasyon imperatiftir. Sisteme tam olarak ne yapacağını söylersin:
let detailVC = DetailViewController()
detailVC.item = selectedItem
navigationController?.pushViewController(detailVC, animated: true)Bir view controller oluşturursun, yapılandırırsın ve yığına itersin. Eylemi sen kontrol edersin.
SwiftUI farklı çalışıyor. Navigasyon yapmıyorsun – verileri yeni view’larda sunuyorsun. Her şey veri odaklı. View’ları kontrol etmiyorsun. Verileri kontrol ediyorsun.
Veri Odaklı Navigasyon Pratikte
NavigationStack ile navigasyon state tarafından yönlendiriliyor. Hangi verinin hangi view’a karşılık geldiğini tanımlıyorsun, geçişleri SwiftUI hallediyor:
struct ContentView: View {
@State private var path: [Item] = []
var body: some View {
NavigationStack(path: $path) {
List(items) { item in
Button(item.name) {
path.append(item) // Modify data, not views
}
}
.navigationDestination(for: Item.self) { item in
DetailView(item: item)
}
}
}
}Kilit satır path.append(item). Bir view itmiyorsun. Bir diziye veri ekliyorsun. SwiftUI değişikliği gözlemliyor ve karşılık gelen view’ı otomatik olarak sunuyor.
Bu Neden Önemli
Bu ayrım sadece felsefi değil – pratik sonuçları var. Navigasyon state olduğu için, doğru path dizisini oluşturarak deep linking’i bedavaya alıyorsun. Path’i kaydederek navigasyon state’ini kalıcı hale getirebilir ve geri yükleyebilirsin. Aynı anda birden fazla öğe ekleyerek programatik olarak herhangi bir derinliğe gidebilirsin.
Bu aynı zamanda kapatmanın sadece veri silme olduğu anlamına geliyor. path.removeLast() çağrısı en üstteki view’ı kaldırıyor. Diziyi temizlemek köke döndürüyor. View controller referanslarını takip etmeye veya navigasyon hiyerarşisinde dolaşmaya gerek yok.
Bu değişimi içselleştirmek zaman alıyor, özellikle yıllarca UIKit deneyimin varsa. Ama bir kez oturduğunda, SwiftUI navigasyonu çok daha tahmin edilebilir hale geliyor. View’ların verilerinin saf fonksiyonları oluyor ve navigasyon da o verinin sadece bir parçası.
