Post

Replies

Boosts

Views

Activity

SwiftUI navigationDestination will make child view's stateObject init multi times with sheet modifier.
Below is my sample code. On the Home page, when I click "show sheet," the sheet page expands, and the StateObject inside the sheet is initialized once. However, when I click "show Fullscreen" and then click "show sheet" inside the fullscreen page, the sheet gets initialized twice. However, if I remove navigationDestination, this issue does not occur. This problem causes the network request in the sheet page to be triggered multiple times. Can someone tell me the reason? enum TestRouter: String, Hashable { case test var targetView: some View { Text("test") } var title: String { return "test title" } } @MainActor struct NavigationInnerView<Content>: View where Content: View { var contentView: () -> Content @MainActor public init(@ViewBuilder contentView: @escaping () -> Content) { self.contentView = contentView } var body: some View { NavigationStack() { contentView() .navigationDestination(for: TestRouter.self) { route in route.targetView } } .navigationViewStyle(StackNavigationViewStyle()) } } struct ContentView: View { @State var showFullScreen: Bool = false @State var showSheet: Bool = false var contentView: some View { VStack { VStack { Text("Home") Button { showFullScreen = true } label: { Text("show fullscreen") } Button { showSheet = true } label: { Text("show sheet ") } } } } var body: some View { NavigationInnerView { contentView .fullScreenCover(isPresented: $showFullScreen) { NavigationInnerView { FullScreenContentView() } } .sheet(isPresented: $showSheet) { NavigationInnerView { SheetContentView() } } } } } class FullScreenViewModel: ObservableObject { @Published var content: Bool = false init() { print("Full Screen ViewModel init") } } struct FullScreenContentView: View { @Environment(\.dismiss) var dismiss @State var showSheet: Bool = false @StateObject var viewModel: FullScreenViewModel = .init() init() { print("Full screen view init") } var body: some View { VStack { Text("FullScreen") Button { dismiss() }label: { Text("dismiss") } Button { showSheet = true } label: { Text("show sheet") } } .sheet(isPresented: $showSheet) { NavigationInnerView { SheetContentView() } } } } class SheetViewModel: ObservableObject { @Published var content: Bool = false init() { print("SheetViewModel init") } } struct SheetContentView: View { @Environment(\.dismiss) var dismiss @StateObject var viewModel = SheetViewModel() init() { print("sheet view init") } var body: some View { Text("Sheet") Button { dismiss() } label: { Text("dismiss") } } } #Preview { ContentView() }
3
0
228
3w
Can I edit NSTextLineFragment position or update manually in TextKit2
In my app, User can select word in the UITextView, then I want to insert a content under the selected words(the comment words shouldn't be selected).like: I found TextKit2 only support edit NSTextParagraph position, or I missed some features in NSTextLayoutManager? I try to override the NSTextLayoutFragment and update the draw(at point: CGPoint, in context: CGContext) but I found, user still can select the origin content at the origin position, even if the layer of linefragment layer on the corrent position not the origin position.
2
0
567
Jan ’25
How to extend my exist Toggle with intents
I create a toggle component based on Toggle public struct Checkbox: View { ... public init(...) { ... } public var body: some View { return HStack(spacing: 8) { ZStack { Toggle("", isOn: $isPrivateOn) ... } ... } } } how can I create a init method to support init with AppIntent like: // Available when SwiftUI is imported with AppIntents @available(iOS 17.0, macOS 14.0, tvOS 17.0, watchOS 10.0, *) extension Toggle { /// Creates a toggle performing an `AppIntent`. /// /// - Parameters: /// - isOn: Whether the toggle is on or off. /// - intent: The `AppIntent` to be performed. /// - label: A view that describes the purpose of the toggle. public init<I>(isOn: Bool, intent: I, @ViewBuilder label: () -> Label) where I : AppIntent }
1
0
636
Jul ’24