Posts

Post marked as solved
4 Replies
You need to start a task that listens for events simultaneously to when you add a new region to monitor, that's the only way to grab the first event at the right time. This can be done with task groups.
Post not yet marked as solved
2 Replies
It's simple to provide conformance using ObjectIdentifier, e.g. import SwiftUI @Observable class ObservableContent: Hashable { var text1 = "Default" var text2 = "" static func == (lhs: ObservableContent, rhs: ObservableContent) -> Bool { lhs === rhs } func hash(into hasher: inout Hasher) { hasher.combine(ObjectIdentifier(self)) } } struct ContentView: View { @State var observableContent: ObservableContent? var body: some View { Group { if let observableContent { NavigationStack { NavigationLink(value: observableContent) { Text("Navigation Link") } .navigationDestination(for: ObservableContent.self) { content in ObservableContentView(content: content) } } } } .onAppear { if observableContent == nil { observableContent = ObservableContent() } } .onDisappear { observableContent = nil } } } struct ObservableContentView: View { @Bindable var content: ObservableContent var body: some View { Form { TextField("Text1", text: $content.text1) Text(content.text1) } } }
Post not yet marked as solved
4 Replies
launchOptions is always nil in app delegate if using scene delegates scene delegate launchOptions does not provide access to the significant location launch reason here is a workaround: https://stackoverflow.com/a/78228563/259521
Post not yet marked as solved
9 Replies
os_log(.info, "launched") appeared in the Console app (With Action->Include Info Messages checked) for me when using the simulator and launching the app from the home screen. These did not appear: print("launched") os_log("launched") os_log(.debug, "launched") // nothing even with Action->Include Info Debug checked!!!
Post marked as solved
4 Replies
I experienced the same bug and have reported it as FB13696956 You can find my report on openradar (the link is not allowed here for some reason?). Another issue I noticed is the for try await events does not throw a cancellation exception when the outer task is cancelled like normal streams do. Please submit your own feedback and reference my report so hopefully it will bring more attention to it so it can be fixed!
Post not yet marked as solved
4 Replies
You need to mark the func as nonisolated if you want a background thread, e.g. nonisolated func startWriteImagesNext() async -> Bool { Because you defined it in a ViewController it inherited the @MainActor which doesn't seem what you want to nonisolated bypasses that. Check the NSViewController/UIViewController header to see its @MainActor annotation. You could also declare the func outside of the ViewController to achieve the same effect, e.g. in a struct that is not marked as @MainActor, or a actor if you want some shared state between all the image tasks.
Post not yet marked as solved
20 Replies
Can reproduce this with Xcode Version 15.1 beta 3 (15C5059c) deploying to iPhone 14 Pro running iOS 17.1.1. Make a test project with Apple's LazyVGrid sample code. Launch app in portrait, scroll to bottom, rotate to landscape, rotate to portrait, scroll to top, crash! let columns = [GridItem(.flexible()), GridItem(.flexible())] var body: some View { ScrollView { LazyVGrid(columns: columns) { ForEach(0x1f600...0x1f679, id: \.self) { value in Text(String(format: "%x", value)) Text(emoji(value)) .font(.largeTitle) } } } } private func emoji(_ value: Int) -> String { guard let scalar = UnicodeScalar(value) else { return "?" } return String(Character(scalar)) } id: \.self tut tut Apple sample code developer! (this is not the cause of this crash though).
Post not yet marked as solved
7 Replies
It seems you have to override the environment locale and switch between one that defaults to am/pm (like GB) and one that is 24hr (like US), e.g. @State var is12h = false let date = Date() ... Text(date, format: .dateTime.hour(.twoDigits(amPM: .abbreviated)).minute(.twoDigits)) .environment(\.locale, Locale(identifier: is12h ? "en_GB" : "en_US")) ... 11:01PM 23:01
Post not yet marked as solved
1 Replies
∙View can conform to Equatable... True, .equatable() is no longer required, not sure what version that changed in. . ∙When view contains @ObservedObject... False, regardless of the outcome of ==, body is always called when any @Published property of the object changes or objectWillChange is published. . ∙Does view, that is Equatable, need to care about equality of its subviews.. No, a subview will just follow the same algorithm. Best to only init a View with the data it actually needs and uses in its body to keep invalidation tight. . ∙When view returns true on equality check... True, if you returned true from == but had @Environment(\.calendar) var calendar and the calendar changed the body would still be called. This is the same behaviour as @ObservedObject in the 2nd question. . ∙When the observed object conforms to Equatable... In my testing the if an ObservedObject conformed to Equatable the == func was never called. My test code: import SwiftUI import Combine struct ViewTest { class MyObject: ObservableObject, Equatable { static func == (lhs: ViewTest.MyObject, rhs: ViewTest.MyObject) -> Bool { // not called let x = lhs.counter1 == rhs.counter1 && lhs.counter2 == rhs.counter2 return x } @Published var counter1 = 0 @Published var counter2 = 0 func inc() { counter1 += 1 } } struct ContentView: View { @State var counter = 0 @State var counter2 = 0 @StateObject var object = MyObject() var body: some View { Form { Button("Increment \(counter)") { counter += 1 } Button("Increment \(counter2)") { counter2 += 1 } // ContentView2(x: counter) { [c = counter] in // print("\(c)") // body is called once when counter2 is changed the first time (once after every time if it has the onReceive // } ContentView2(x: counter2) .environment(\.calendar, ((counter % 2 == 0) ? Calendar.current : Calendar(identifier: .chinese))) //{ // print("\(self.counter)") // body called every time counter2 is changed // } // .equatable() } } } struct ContentView2: View, Equatable { // @Environment(\.managedObjectContext) var context //@State var counter = 0 //@ObservedObject var object: MyObject @Environment(\.calendar) var calendar let x: Int // let y: () -> () // if the closure passed in does somethiung with self then body is always called. static func == (lhs: Self, rhs: Self) -> Bool { let result = lhs.x == rhs.x //&& lhs.object.counter2 == rhs.object.counter2 return result } var body: some View { let _ = Self._printChanges() HStack { Text("ff") Button("Button") { //y() } } // .onReceive(Just(0)) { _ in // causes body to be called // print("") // } // .task { // counter = 0 // }.onChange(of: x) { a in // // } // .onAppear { // counter = 0 // } } } }
Post not yet marked as solved
3 Replies
The solution is don't use view model objects! You have to learn the View struct which is designed to hold your view data in a memory efficient hierarchy. It has a lot of magical features like dependency tracking and change detection which you just have to learn to use SwiftUI effectively. @Observable is for model data it won't work for view data. You might get close to implementing the same behaviour as the View struct but you'll eventually get stuck so it is a complete waste of time. Correct SwiftUI code would look like this: struct ModalConfig { var isPresented = false var otherVar = "" mutating func present() { isPresented = true otherVar = "" } mutating func dismiss() { isPresented = false } } struct ModalView: View { @Binding var config: ModalConfig var body: some View { ZStack { Color.yellow .ignoresSafeArea() Button("Close") { config.dismiss() } } } } struct ContentView: View { @State var config = ModalConfig() var body: some View { Button("Present sheet modally") { config.present() } .sheet(isPresented: $config.isPresented) { ModalView(config: $config) } } }
Post not yet marked as solved
11 Replies
Same problem here, ModelConfiguration(cloudKitDatabase: .none) still uses CloudKit and the app crashes in my case with: CloudKit integration requires that all relationships be optional, the following are not: Contact: addresses Have to disable CloudKit capability to get it to run which is a terrible workaround. Submitted FB13209319 referencing FB12276416
Post not yet marked as solved
21 Replies
Xcode Version 15.0 beta 7 (15A5229h) has the same problem. It's burning my legs!
Post marked as solved
7 Replies
Same problem here, it happens when I try this in my AppIntent: @Parameter(title: "Image") var file: IntentFile error: Invalid Swift parseable output message (malformed JSON): `1` (in target 'IntentTest2' from project 'IntentTest2') error: Invalid Swift parseable output message (malformed JSON): `{ "kind": "finished", ` (in target 'IntentTest2' from project 'IntentTest2') "name": "compile", "pid": 64892, "process": { "real_pid": 64893 }, "exit-status": 0 } Command SwiftCompile emitted errors but did not return a nonzero exit code to indicate failure
Post not yet marked as solved
3 Replies
I have the same error "The action “Demo Action” could not run because an internal error occurred." in Xcode 15 beta 5. I resolved it by making a Multiplatform app template instead of a macOS.
Post not yet marked as solved
8 Replies
Your use of URLSession and @StateObject likely means you are attempting to do async networking in this object so it shouldn't be @MainActor because you'll want your async funcs to run on background threads not on the main thread. Also, when switching from @ObservedObject to @Observable you no longer need to use Task { @MainActor in when setting vars (@Published in case of @ObservedObject) with the results of the network calls.