-
Notifications
You must be signed in to change notification settings - Fork 2
SwiftUI
Изучение SwiftUI:
❎
✔️
https://github.com/vp6111998/IOS-Development-Resources/wiki
Код:
var body: some View {
NavigationView {
NavigationLink(destination: LandmarkDetail(landmark: landmark)) {
LandmarkRow(landmark: landmark)
}
}
Для того, чтобы при нажатии на button можно было переключиться на новую MVC, мы создаем NavigationLink

в сам код передаем нажимаемую кнопку:

в destination передаем то, куда мы хотим переключиться при нажатии:

Таким образом, при нажатии на Turtle Rock мы переходим на развернутое его описание
@State - это чтобы при нажатии сохранялись сами данные.Cледует использовать с простыми типами структур, которые включают String и Int. атрибут, который является эквивалентом типа класса. The first one is straightforward: @State should be used when you have a value-type property that is owned by the current view. So, integers, strings, arrays of stuff, and more are all great candidates for @State.
@StateObject because the “state” part means “this is owned by the current view.”
Важно помнить, что @State и @StateObject означает «это представление владеет данными», в то время как другие оболочки свойств, такие как @ObservedObject и @EnvironmentObjectнет.
@ObservedObject - ваше представление не владеет объектом (когда владеет - это @StateObject, а observed просто хранит)(он может быть уничтожен в любое время). Кто-то другой должен создать и передать его вам, и они сохранят его живым для вас. Хитроумно, что это будет терпеть неудачу только иногда , поэтому вы можете подумать, что ваш код в порядке, только для того, чтобы позже он отказал в какой-то случайный момент.
Problems: When you push views onto navigation view and come back to the root view, you observed object's gone because swiftUI has destroyed your view and did not keep the model alive.
Не работают, если их обернуть в Property wrappers(@), но есть решение onChange()
.
struct ContentView: View {
@State private var rating = 0.0
var body: some View {
Slider(value: $rating)
.onChange(of: rating) { value in
print("Rating changed to \(value)")
}
}
}
То же самое, что и этот код, но он не работает:
struct ContentView: View {
@State private var rating = 0.0 {
didSet {
print("Rating changed to \(rating)")
}
}
var body: some View {
Slider(value: $rating)
}
}
Вместо использования func() -> some View
:
extension View {
public func eraseToAnyView() -> AnyView {
AnyView(self)
}
}
private func printText() -> some View {
return Text("text").eraseToAnyView()
}
Нужно использовать: var: some View
с @ViewBuilder
, который позволит избавиться от erase'ов
@ViewBuilder
private var printText: some View {
Text("text")
}
- Which protocol do you use to bridge UIKit view controllers into SwiftUI?
Create a structure that conforms to UIViewControllerRepresentable and implement the protocol requirements to include a UIViewController in your SwiftUI view hierarchy.
- In which method do you create a delegate or data source for a UIViewControllerRepresentable type?
Return an instance of the coordinator type from makeCoordinator(). SwiftUI manages its life cycle and provides it as part of the context parameter in other required methods.
SwiftUI - отличный фреймворк, но иногда нам нужно повторно использовать классы UIKit, которые мы годами использовали в iOS SDK . К счастью, это очень просто сделать с помощью протокола UIViewRepresentable