Post

Replies

Boosts

Views

Activity

How To Make Optional Variables in SwiftUI View
Please see sample code struct Test: View { var array: [String] = [] init() { } var body: some View { Text(String(description: array.count) } } struct Test_Previews: PreviewProvider { static var previews: some View { Test(array: ["1", "2", "3"]) } } This one is a string array, I wish to pass some values only in preview because in the main view, i will be fetching data from a url. While setting this variable array to an empty array is the solution, what if my variable is a Struct? or Class? How will i make this optional and only supply a new Struct/Class instance in the preview only
2
0
994
Sep ’22
URLSession dataTask Does not fetch data
Hi, i had successfully fetched data from a URL but i cannot figure out why its sub link from the same domain, does not fetch any data. it always shows nil, but it contains byte like 39962 bytes. If it is nil, shouldnt that be something like 0 bytes Sample url is this. https://earthquake.phivolcs.dost.gov.ph/2022_Earthquake_Information/September/2022_0922_1059_B2.html This is how I fetch the data from url URLSession.shared.dataTask(with: URL(urlString)) { (data, response, error) in       guard let data = data else {         completion(nil)         return       }       if error != nil {         completion(nil)       }       else {         print(data)         completion(String(data: data, encoding: .utf8))       }     }.resume() Thoughts? What could be wrong? If it is https://earthquake.phivolcs.dost.gov.ph, i can fetch its data without issues.
4
0
1.3k
Sep ’22
Generic View Returning a Closure Option
Hi. I am new to SwiftUI and i am not sure what the right term for this is. Hoping someone can guide me Take this generic view for example (this one is incorrect since if i pass a view as parameter, how can it use the fetched data). struct FetchUrlContentView<Content: View>: View {   var url: String?   @State var loading = true   @State var error = false   @State var view: Content       var body: some View {     HStack {       if !NetworkTool.hasInternet() {         NoInternetView()       }       else if loading {         LoadingProgressView()       }       else if error {         SomethingWrongView()       }       else {         view       }     }     .task { if let urlLink = self.url {         fetchContentFromUrl(url: urlLink, { data in // Supposed to use data to the view here but it won't be generic. // any ideas?           self.loading = false         })       }       else {         self.loading = false         self.error = true       } } } What i am looking for is something of a way to keep on reusing FetchUrlContentView such that after data is fetched, i could call it like this FetchUrlContentView(url: "https://www.test.com/", loading: true) { data in MyView(data) } where MyView contains something like Text(data.description)
1
0
703
Sep ’22
Possible to have 2 let variables in 1 if condition?
I am converting Java code to Swift. This is the Java code try { if (filter == null || Float.parseFloat(ew.getMagnitude()) >= Float.parseFloat(filter)) liist.add(ew); } catch (NumberFormatException e) { } In Swift, currently this is what I have do {                     if let toFilter = filter, Float(ew.magnitude ?? "0") >= Float(toFilter ?? "0") {                           list.append(ew)                       }                     }                     else {                       list.append(ew)                     }                   } catch {                                        } Currently it even gives out an error that I have to add a ! after the Float() because "Force-unwrap using '!' to abort execution if the optional value contains 'nil'" But i do not want that, that is why I placed th do/catch there Please enlighten. Thank you
0
0
247
Sep ’22
Convert Date From Timezone
Hi, this is my function I cannot figure out why i always get jan 1, 2000 [time...] this is my code if let thisTime = Int64(time) {     let date = Date(timeIntervalSince1970: TimeInterval(thisTime) / 1000)     let dateWithTimezone = convertStringToDateWithTimezone(date)     print(formatDate(dateWithTimezone, "hh:mm a")!) } The date variable is correct but once I use convertStringToDateWithTimezone the result is always jan 1, 2000 [time...] Any idea what could be wrong?   func convertStringToDateWithTimezone(_ d: Date) -> Date {     let dateFormatter = DateFormatter()     dateFormatter.timeZone = TimeZone.current     return dateFormatter.date(from: (dateFormatter.string(from: d)))!   } func formatDate(_ date: Date?, _ pattern: String) -> String? {     if let date = date {       let dateFormatter = DateFormatter()       dateFormatter.locale = Locale(identifier: "en")       dateFormatter.dateFormat = pattern       return dateFormatter.string(from: date)     }     return nil   }
0
0
313
Sep ’22
What kind of string interpolation is this in Swift? {0} ...
So String interpolation is possible in Swift. However, the samples i have seen are either expressions or variables placed inside the "". Is it possible to replace with values if you have {0} and {1} in the string? I do not know what this is called in Swift if this is possible. I thought it is still interpolation but all I see are posts that do not have {0} ... Or is this feature not available in Swift?
1
0
514
Oct ’22
Why Main content and overflow menu button not clickable/scrollable?
Hi all, this is my last recourse by posting here since I really could not find a solution to my problem. My issue is that if there is a scrollable lazyVStack in the main content area, or if i cick on the overflow menu button, nothing happens. the button to show the side menu view works ok though. as is clicking on the rows of the LazyVStack. The cause of the ZStack top most but I am not sure what the problem is because the issue only occurs if it is in dark mode. And, the issue only happens if i am in dark mode. Just weird. This is the code var body: some View {     NavigationView {       ZStack(alignment: .leading) {         VStack(spacing: 0) {           HStack {             Button(action: {               withAnimation(.default) {                 show.toggle()               }             }) {               Image(systemName: "line.3.horizontal")             }             Spacer()             Text("Home")             Spacer()             OverflowMenu()           }           .padding()           .foregroundColor(.primary)           .overlay(Rectangle().stroke(Color.primary.opacity(0.1), lineWidth: 1).shadow(radius: 3).edgesIgnoringSafeArea(.top))                       MainContent(navigationManager: navigationManager)             .frame(maxWidth: .infinity, maxHeight: .infinity)         }         HStack {           SideMenuView(dark: $dark, show: $show, navigationManager: navigationManager)             .preferredColorScheme(dark ? .dark : .light)             .offset(x: self.show ? 0 : -UIScreen.main.bounds.width / 1.2)           Spacer(minLength: 0)           Rectangle().stroke(.clear).frame(width: show ? UIScreen.main.bounds.width - (UIScreen.main.bounds.width / 1.2) : 0)             .contentShape(Rectangle())             .onTapGesture {               if (show) {                 withAnimation(.default) {                   show.toggle()                 }               }             }         }         .background(Color.primary.opacity(self.show ? (self.dark ? 0.05 : 0.2) : 0).edgesIgnoringSafeArea(.all))       }       .navigationBarHidden(true)     }     .navigationViewStyle(.stack)   } OverflowMenuView struct OverflowMenu: View {       @State var isClickedSettings = false   @State var isClickedAbout = false   @State var isClickedFaq = false   @State var isClickedRemoveAds = false       var body: some View {     VStack {       NavigationLink(destination: SettingView(), isActive: $isClickedSettings) {         EmptyView()       }       .hidden()               NavigationLink(destination: SettingView(), isActive: $isClickedAbout) {         EmptyView()       }       .hidden()               NavigationLink(destination: SettingView(), isActive: $isClickedFaq) {         EmptyView()       }       .hidden()               NavigationLink(destination: SettingView(), isActive: $isClickedRemoveAds) {         EmptyView()       }       .hidden()               Menu {         Button {           isClickedSettings = true         }         label: {           Label {             Text(StringTool.localize("settings"))           }           icon: {             Awesome.Solid.cog.image               .foregroundColor(UIColor(named: "MenuSetting")!)           }         }                   Button {           isClickedAbout = true         }         label: {           Label {             Text(StringTool.localize("about"))           }           icon: {             Awesome.Solid.infoCircle.image               .foregroundColor(UIColor(named: "MenuAbout")!)           }         }                   Button {           isClickedFaq = true         }         label: {           Label{             Text(StringTool.localize("faq"))           }           icon: {             Awesome.Solid.bookOpen.image               .foregroundColor(UIColor(named: "MenuFaq")!)           }         }                   Button {           isClickedRemoveAds = true         }         label: {           Label{             Text(StringTool.localize("remove_ads"))           }           icon: {             Awesome.Solid.unlockAlt.image               .foregroundColor(UIColor(named: "MenuRemoveAds")!)           }         }       } label: {         Image(systemName: "ellipsis.circle")       }     }   } } Any Idea?
1
0
499
Oct ’22
Help Setting Google Maps
Hi all. I have not found a solution to this. Showing Recent Issues GoogleMaps.xcframework' is missing architecture(s) required by this target (arm64), but may still be link-compatible. So many posts saying go to Build Settings and in debug/release exclude arm64 but there is none here. I am using xcode 13.4.1 Anyone got ideas?
2
0
699
Oct ’22
How To Create a Marker With Callout in MapKit SwiftUI
I have not seen a tutorial that shows a callout when a marker is clicked in the map. Can anyone please confirm? Weird that this feature is not included. The callout I need is just a simple title and subtitle. That's all. Tutorials only show how to render using MapMarker, MapPin and custom MapAnnotations but these do nothing since they only show icons.
2
0
532
Oct ’22
How To Change/Specify Custom View In Other areas Of the View for Every Child View Change In SwiftUI
Hi. Beginner here. Currently this is how my app looks like. What I wish to do is for every view that gets changed highlighted by the green square border, the menu item in the top horizontal HStack (my so called toolbar) also changes (highlighted in yellow circle). Currently, I use an ObservedObservable to change the view (green square) via the sidebarmenu. What is the best approach to the toolbar part? I was thinking that maybe within the child view e.g. SampleMap1, it has a custom menu item view variable which will be shown in the parent view (Where the yellow circle is lcoated) to add the menu item view. But I am not sure how to go about it. Advise, suggestions appreciated. Thoughts? These are what i have so far ... struct MainContent: View {   @ObservedObject var navigationManager : SidebarNavigationManager       var body: some View {     VStack(spacing: 0) {       switch navigationManager.menuCategory {         case .SAMPLE1:           SampleMap1()         case .SAMPLE2:           SampleMap2()       }     }     .navigationBarTitleDisplayMode(.inline)   } } And content view looks like this ... struct ContentView: View {   @StateObject var navigationManager = SidebarNavigationManager()    @State var show = false   var body: some View {     NavigationView {       ZStack(alignment: .leading) {         VStack(spacing: 0) {           HStack {             Button(action: {               withAnimation(.default) {                 show.toggle()               }             }) {               Image(systemName: "line.3.horizontal")             }             Spacer()             Text("Home")             Spacer() // This is where I wish to put like 2 or 3 menu items, default hidden and will show when the child view provides a menu item view with it that will get shown here             OverflowMenu() <-- ordinary view           }           .padding()           .foregroundColor(.primary)           .overlay(Rectangle().stroke(Color.primary.opacity(0.1), lineWidth: 1).shadow(radius: 3).edgesIgnoringSafeArea(.top))                       MainContent(navigationManager: navigationManager)             .frame(maxWidth: .infinity, maxHeight: .infinity)         }         HStack {           SideMenuView(show: $show, navigationManager: navigationManager)             .offset(x: self.show ? 0 : -UIScreen.main.bounds.width / 1.2)           Spacer(minLength: 0)           Rectangle().stroke(.clear).frame(width: show ? UIScreen.main.bounds.width - (UIScreen.main.bounds.width / 1.2) : 0)             .contentShape(Rectangle())             .onTapGesture {               if (show) {                 withAnimation(.default) {                   show.toggle()                 }               }             }         }       }       .navigationBarHidden(true)     }     .navigationViewStyle(.stack)   } } struct SampleText : View {   let text: String       var body: some View {     Text(text)   } }
1
0
476
Oct ’22
Adding Custom InfoWIndow In Google Maps SDK In SwiftUI
Hi all. Came here as a last resort. All the samples provided that I came across are not in SwiftUI. Google's documentation is also outdated since they do not provide any samples or tutorial to do so in SwiftUI. While showing the map in SwiftUI requires you to extend a UIViewRepresentable, i have no clue how to apply the custom info window with it. Anyone got suggestions?
0
0
513
Oct ’22
Merge An Array Item's Array Property Based On Property
The title might be confusing but here is an example data to give a clear understanding struct City { var name: String? var businesses: [Business]? } So if i have a city array, i wish to merge the businesses array based on the city name since the city may have duplicates e.g. [ { name: "CIty 1" businesses: [ { name: "Business 1" }, { name: "Business 2" }, ] }, { name: "CIty 2" businesses: [ { name: "Business 1" }, { name: "Business 2" }, ] } { name: "CIty 1" businesses: [ { name: "Business 3" }, { name: "Business 4" }, ] } ] In the data example above, there are 2 entries of City1. i am looking for a way to not have to use a dictionary, if it is possible to use the existing array and output it such that there is only 1 entry of City but will contain 4 entries of business. Thoughts?
2
0
411
Oct ’22
How to Resize Placeholder in Kingfisher where loading icon is in the middle
Hi. Please see screenshot. Currently the icon placeholder is small. What I am trying to replicate is to have an area (the one in red) where the place holder icon is in the middle horizontally and vertically. That same red area is where the downloaded image will be drawn. I think the term for this is aspect ratio if i am not mistaken? That the height should be proportionate based on the width. I am using Kingfisher to load the image. This is what I have. KFImage.url(URL(string: ""))             .placeholder {               HStack {                 Image(systemName: "photo")                   .resizable()                   .frame(width: 50, alignment: .center)                                       .background(.red)               }               .background(.yellow)               .scaledToFit()             }             .fade(duration: 0.25)             .onFailure { error in print("Load image error : \(error) = \(earthquakeDetail.imgUrl)")             }             .resizable()             .aspectRatio(contentMode: .fill) Based on the screenshot image, the area for HStack is so thin with its height being small. My goal is to create an area like the one in red border. Thoughts?
2
0
1.6k
Oct ’22
Import An Objective-C Library To A Swift Project
All posts i came across instructs the user to import the objective c files into the swift project so that a bridging header file can be created to expose it. Does this mean i have to instead download the objective c library, extract and copy all the files to the swift project? where the prompt to create the bridging header will be triggered? Or is there a way to install the objective c library via cocoapods and manually trigger to create the bridging header to make it usable? I prefer the latter, if it is possible?
0
0
413
Oct ’22