Post

Replies

Boosts

Views

Activity

Reply to Most efficient way to call a function upon variable state change
Hi, I have a follow up question. In an older project, using that code, I get an error: 'onChange(of:initial:_:)' is only available in iOS 17.0 or newer The solution provided is to wrap the code in if #available(iOS 17.0, *) { }, but I'm only able to wrap the whole view inside of it, like so: if #available(iOS 17.0, *) { VStack () { // view with .onChange } } else { VStack () { // view with older solution } } The view is quite lengthy so it would be very redundant to have the same view twice, (the same view for each component of the if/else statement). Is there a way to implement an if statement so that I would only need the code for the view once (something like the code below)? VStack { } if #available(iOS 17.0, *) { .onChange() { } } else { // older solution }
Jul ’24
Reply to Incorrect JSON Format with JSONEncoder
Hi, Thank you for your response. Here is the whole function: func createAccount(account: AccountCreationData, completion: @escaping (Response) -> Void) { guard let url = URL(string: "http://localhost:4300/account/create-account") else { return } var request = URLRequest(url: url) request.httpMethod = "POST" print(account) guard let encoded = try? JSONEncoder().encode(account) else { print("Failed to encode request") return } print(encoded) request.httpBody = encoded URLSession.shared.dataTask(with: request) { (data, response, error) in guard let data = data else { return } do { let resData = try JSONDecoder().decode(Response.self, from: data) DispatchQueue.main.async { completion(resData) } } catch let jsonError as NSError { print("JSON decode failed: \(jsonError)") } }.resume() } Below are print statements of account and encoded: AccountCreationData(name: "name", email: "email", phone: "phone", password: "password") 110 bytes
Jul ’24
Reply to Using Swift UI Canvas
One thing I have noticed is the Canvas code doesn't run until there's a gesture, and I'm not sure why that is because the documentation has an example that displays a drawing upon loading the Canvas. struct Line { var points: [CGPoint] var color: Color } var body: some View { @State var lines: [Line] = [] Canvas { ctx, size in for line in lines { let color = line.colorName == nil ? getColor(colorName: nil, rgb: line.rgb) : getColor(colorName: line.colorName, rgb: nil) var path = Path() print(line.points) // this is how I noticed this code doesn't run until the gesture runs. This print statement doesn't run upon loading the Canvas path.addLines(line.points) ctx.stroke(path, with: .color(color), style: StrokeStyle(lineWidth: 5, lineCap: .round, lineJoin: .round)) } } .gesture(DragGesture(minimumDistance: 0, coordinateSpace: .local) .onChanged({ value in draw(position: value.location, translation: value.translation) } }) ) .onAppear { lines = parseLinesString() for line in lines { for point in line.points { draw(position: point, translation: nil) } } } func draw(position: CGPoint, translation: CGSize?) { if translation == .zero || translation == nil { lines.append(Line(points: [position], color: color.black)) } else { guard let lastIndex = lines.indices.last else { return } lines[lastIndex].points.append(position) unsaved = true } } } As I mentioned previously, I'm not sure how to translate the documentation example to my application. If anyone could point me in the right direction that would be greatly appreciated. Thank you.
Jan ’24
Reply to Using Swift UI Canvas
@Claude31 Thank you for your response. Below is revised code, with the ScrollView implemented, so the drawing aspect isn't going to work unless that's removed. I put a comment in .onAppear { } where I'm assuming code needs to be written to plot the points from lines onto the canvas. I looked at the official documentation for canvas' that draws upon loading but I can't seem to figure out how to apply it to what I'm doing. import SwiftUI struct LineData { var points: [CGPoint] var color: Color } struct CanvasExample: View { @State var lines: [LineData] = [] @State var selectedColor: Color = Color.black var body: some View { ScrollView (showsIndicators: false) { VStack { Canvas { ctx, size in for line in lines { var path = Path() path.addLines(line.points) ctx.stroke(path, with: .color(line.color), style: StrokeStyle(lineWidth: 5, lineCap: .round, lineJoin: .round)) } }.gesture(DragGesture(minimumDistance: 0, coordinateSpace: .local) .onChanged({ value in let position = value.location if value.translation == .zero { lines.append(LineData(points: [position], color: selectedColor)) } else { guard let lastIndex = lines.indices.last else { return } lines[lastIndex].points.append(position) } }) ) .onAppear { // code that takes data passed to variable lines and draws on canvas } } } } } #Preview { CanvasExample() } Thank you.
Jan ’24
Reply to Using the SwiftUI Canvas
I have two follow up questions. Any help would be greatly appreciated. How can I implement a scroll feature with the Canvas so that the Canvas itself would be larger than the screen? How can I draw on the canvas upon loading the canvas? For example, if I pass data stored as a Line variable to the view that the Canvas is on, how can I draw onto the canvas upon loading based off of that data? Thank you.
Jan ’24
Reply to Cannot convert value of type '() -> ()' to expected argument type 'String' SwiftUI Button
@sha921 @thibautrichez Thank you for your responses. I get the following errors with the code below: Button { login() } label: { ZStack { RoundedRectangle(cornerRadius: 5) .fill(Color.black) .frame(width: UIScreen.main.bounds.width - 50, height: 50) Text("Sign in") .foregroundColor(.white) } } func login() { print("test") } Incorrect argument label in call (have '_: label:', expected 'value:selected:') Trailing closure passed to parameter of type 'String' that does not accept a closure Thank you again for the help so far.
Dec ’23