Post

Replies

Boosts

Views

Activity

How To Loop Video In SwiftUI
Anyone got sample code for using AVPlayerLooper in SwiftUI? Code i see are not for SwiftUI I only wish to have the option to turn on auto-repeat on and off. I could use AVQueuePlayer as replacement for AVPlayer but it does not have a way to loop. So these are what I am looking for Loop video in SwiftUI If Using AVPlayerLooper, it has a disableLooping() function (possibly to turn off looping). But how can it be turned back on? There is no enableLooping(). Or does it need a new instance? since i am new to iOS, the code there are all linked to no swift ui code so I have no clue (sorry) the equivalent of them in SwiftUI Thoughts?
2
0
4.3k
Mar ’23
Stepper is still buggy?
Anyone experienced this. My goal is to use AppStorage to save the value in the stepper but the behavior is whaked. Buttons get disabled even when theyre not at both ends of the array if i use State, it works a bit better but the buttons only get disabled after the 2nd or 3rd try when the index is either 0 or at the end of the array. @AppStorage("index") private var opacity = 0 let options = [40, 50, 70, 80, 90, 100]         Stepper {           Text("\("Opacity") \(options[opacity].description)%")         } onIncrement: {           opacity = opacity + 1           if opacity >= opacity.count {             opacity = opacity.count - 1           }           print("onincrement="+String(opacity))         } onDecrement: {           opacity = opacity - 1           if opacity < 0 {             opacity = 0           }           print("ondecrement="+String(opacity))         } The sample code looks simple. I am not sure what else I could be missing?
2
0
583
Nov ’22
Is it possible to rebuild overlay only and not the body?
Hi. I am not sure how to do this case scenario I am having. Please see sample code @State private var tileLayers: [GMSURLTileLayer]?    @State private var isShowingLegend = true     var body: some View {     MapView(       tileLayers: tileLayers     )     .task {       setupMenuItems()               if load {         load = false         processRainWatcher()       }     }     .overlay(       isShowingLegend ?         HStack {           RainWatcherLegendView()           Spacer()         }         .transition(.move(edge: isShowingLegend ? .leading : .trailing))       : nil,       alignment: .bottom     ) } This is not a working code. But i wish to ask suggestion. because the overlay shows a legend view. If isShowingLegend.toggle() is triggered, it animates sliding in and out of the screen. Problem mis, everything gets rebuilt. so the tile layer in the MapView() gets re-rendered again. is there a way not to let this happen, but still let the legend animate sliding in and out? or perhaps pass a binding variable to the legend view? and do the animation in that view? so that the parent view does not get rebuilt? thoughts?
2
0
751
Dec ’22
Attempting to store bytes of data in CFPreferences/NSUserDefaults on this platform is invalid
I am not really sure what is the cause but this happens if i overwrite values. if i clear the app from scratch and store them all it works ok. Thoughts? my exact message is Attempting to store >= 4194304 bytes of data in CFPreferences/NSUserDefaults on this platform is invalid Description of keys being set: holocene_update: string value, approximate encoded size: 25 Description of keys already present: holocene: string value, approximate encoded size: 5216090 GMSMapsUserClientZwiebackCookie: string value, approximate encoded size: 175 GMSMapsUserCookie: data value, size: 48 kGMSServerVersionMetadataTrackerSavedServerVersionMetadataKey: data value, size: 30 holocene_update: string value, approximate encoded size: 25 com.google.Maps.GMSCoreLastVersion: string value, approximate encoded size: 6 cyclone_alert_last: string value, approximate encoded size: 5 com.google.Maps.GMSSDKLastVersion: string value, approximate encoded size: 5 GMSMapsUserClientCohort: string value, approximate encoded size: 4 kGMSMapsUserClientLegalCountry: string value, approximate encoded size: 2 ... Total keys: 12 - Average approximate value size: 434699 bytes 2022-12-19 17:49:08.777899+0800 PH Weather And Earthquake Updates[31305:4102377] [User Defaults] CFPrefsPlistSource<0x600002b80980> (Domain: ************, User: kCFPreferencesCurrentUser, ByHost: No, Container: (null), Contents Need Refresh: No): Transitioning into direct mode Is there a way to increase this limit? I need to store data.
2
0
918
Dec ’22
How To Declare Optional Parameter Function
I have a function like this @ViewBuilder   func addInfo(_ text: String, action: (() -> Void)?, addDivider: Bool = true, centerAlignment: Bool = false, isBold: Bool = false) -> some View {     VStack {       Text(text)         .fontWeight(isBold ? .bold : .regular)         .frame(maxWidth: .infinity, alignment: centerAlignment ? .center : .leading)         .padding([.leading, .trailing], 10)         .padding([.top, .bottom], 5)         .contentShape(Rectangle())         .onTapGesture {           if let action {             action()           }         }       if addDivider {         Divider()       }     }   } I do not understand why i get a compile error Expected type after '->' if i call the function like this addInfo("Sample", action: () -> Void {             }) The error points to Void. What is the correct way to do this? Please advise.
2
0
830
Dec ’22
Parser Json with Single Quote
Hi. I am having issues with json parsing. all my source data use double quote except for one. here is the sample do { let json = "[['16772', 'Cebu', 'Philippines']]" if let jsonArray = try JSONSerialization.jsonObject(with: Data(json.utf8), options: []) as? [[Any]] { print("Hello World") } } catch { print(error) } if the json string is let json = "[[\"16772\", \"Cebu\", \"Philippines\"]]" it works ok. but if it is single quote, then it gives out the error message Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around line 1, column 2." UserInfo={NSDebugDescription=Invalid value around line 1, column 2., NSJSONSerializationErrorIndex=2} What am i missing to enable parsing single quote normally? Thoughts?
2
0
1.9k
Dec ’22
Why Does Image Overlap In GridRow?
struct TweetFeedSelectionGridView: View {   private let ICON_SIZE: CGFloat = 40   private let ROW_BOTTOM_PADDING: CGFloat = 40       var body: some View {     Grid(alignment: .top, verticalSpacing: ROW_BOTTOM_PADDING) {       createTwitterFeedRow(["TwitterDilg", "TwitterDoh", "TwitterDole"])       createTwitterFeedRow(["TwitterDswd", "TwitterDepEd", "TwitterMmda"])       createTwitterFeedRow(["TwitterNdrmmc", "TwitterPagasa", "TwitterPcoo"])       createTwitterFeedRow(["TwitterPhivolcs", "TwitterPia", "TwitterPna"])       createTwitterFeedRow(["TwitterPnp", "TwitterRedCross", "TwitterTxtFire"])     }     .frame(maxWidth: .infinity)     .background(.red)   }       @ViewBuilder   func createTwitterFeedRow(_ feeds: [String]) -> some View {     GridRow {       createTwittedFeedCell(feeds[0])       createTwittedFeedCell(feeds[1])       createTwittedFeedCell(feeds[2])     }     .frame(maxWidth: .infinity)   }       @ViewBuilder   func createTwittedFeedCell(_ iconLabel: String) -> some View {     VStack {       Image(uiImage: UIImage(named: iconLabel)!)         .frame(width: ICON_SIZE, height: ICON_SIZE)       Text(iconLabel.replacingOccurrences(of: "Twitter", with: ""))         .padding(.top, 10)     }   } } struct TwitterFeedSelectionGridView_Previews: PreviewProvider {   static var previews: some View {     TweetFeedSelectionGridView()   } } Why does the image in the first row overlap? I have no clue why. The image is an ImageSet of 80, 160 and 240x240 images.
2
0
699
Jan ’23
BGTaskScheduler.shared.register() does not get called
Hi all. Any clue why BGTaskScheduler.shared.register() does not get called? The print does not show anything to console. I already registered them in Permitted Background task scheduler identifiers and added 2 items for package.Task.updateAppRefresh package.Task.updateAppProcessing I re-read the tutorial and I cannot figure out what else i am lacking? Thoughts?
2
0
1.3k
Mar ’23
Incorrect rounding off result
Hi, what do you think is wrong with the fucntion. This is what I have. Could it be because of the roundmode type used? static func roundOff(_ val: String, _ decimalPlace: Int) -> String {     let decimalFormatter = createDecimalFormatter()     decimalFormatter.minimumFractionDigits = decimalPlace     decimalFormatter.maximumFractionDigits = decimalPlace     let bigDecimal = NSDecimalNumber(string: val)     return decimalFormatter.string(from: bigDecimal.rounding(accordingToBehavior: NSDecimalNumberHandler(roundingMode: .up, scale: Int16(decimalPlace), raiseOnExactness: false, raiseOnOverflow: false, raiseOnUnderflow: false, raiseOnDivideByZero: false)))!   }   static func roundOff(_ value: Double, _ decimalPlace: Int) -> String {     return roundOff(String(value), decimalPlace)   } roundOf("75.2", 0) returns 76 instead of 75
2
1
584
Mar ’23
How To Open A New View From Popup Menu
This is my struct view for the overflow menu struct OverflowMenu: View {   var body: some View {     Menu {       NavigationLink(destination: SettingView()) {         Label{           Text("Settings")         }         icon: {           Awesome.Solid.cog.image             .foregroundColor(UIColor(hex: "#ffbd16"))         }       }     } label: {       Image(systemName: "ellipsis.circle")     }   } } Nothing happens when the button is clicked. The SettingsView is not shown in a new window. And the OverflowMenuView() is inside the NavigationView. Am i missing something else? var body: some View {     NavigationView { ..... HStack {                 Spacer()                 OverflowMenu()           } } }
3
31
821
Sep ’22
Fix For Type '()' cannot conform to 'View' Error?
See sample code @State private var citiesList: [City]? var body: some View {     if let cities {       content(cities)     }     else {       AsyncView(         operation: { try await getData(()) },         content: { cities in                      contentView(cities)         }       )     }   } So this works ok. my issue is when adding a code above contentView(cities) since it seems this kind of closure only accepts 1 line, returning a view and does not accept any other code? like if i add the line citiesList = cities contentView(cities) it will say Type '()' cannot conform to 'View' What is the solution for this? Or is it possible that the "cities in" part, i can assign it to the citiesList, so that citiesList will be passed to the content(citiesList) method instead of content(cities) ?
3
0
1.1k
Oct ’22
How to Run Task inside Footer When Visible
This is my current view. Instead of a List, I use a LazyVStack wrapped under a ScrollView. .onAppear does not seem to work here. I assumed it runs when the view is visible on the screen. My goal is when the footer is visible, it always runs a Task. What could be wrong? @State private var cities: [City]? @State private var index = 0 @State private var showFooter = true func content(_ cities: [City]) -> some View {     return GeometryReader { geometryProxy in       ScrollView {         LazyVStack(alignment: .leading, spacing: 0) {           if cities.count > 0 {             ForEach(cities) { city in               HStack {                 Text(city.header)                   .bold()                   .foregroundColor(.white)                   .textCase(.uppercase)                   .padding(.all, 8)                 Spacer()               }               .background(Color(UIColor(named: PrefTool.instance.getBoolean(Keyword.DARK_MODE) ? "DarkerGray" : "DarkGray")!))                             ForEach(city.businesses) { busines in                   Text(business.name)                  Divider()               }             }           }           else {             Text("Empty List")           }         }         .safeAreaInset(edge: .bottom, spacing: 0) {           if showFooter {             VStack {               Text("Footer")             }             .padding()             .frame(maxWidth: .infinity)             // The background will extend automatically to the edge             .background(Color.green)             .onAppear {               Task {                 do {                   let moreList = try await getMoreCities(index)                   showFooter = false                   if !moreList.isEmpty {                     cities?.append(contentOf: moreList)                     showFooter = true                   }                 } catch {                   showFooter = false                 }               }             }           }         }       }     }   } This is used inside body var body: some View { content(cities) } Thoughts? What is a good way to show a footer and then run a task when it is visible in the screen.
3
1
362
Oct ’22
LocationManager Error when requesting location
Hi . I am following the simple example from hacking with swift website. It is to request a location. import CoreLocation import CoreLocationUI class LocationManager: NSObject, ObservableObject, CLLocationManagerDelegate {   let manager = CLLocationManager()   @Published var location: CLLocationCoordinate2D?   override init() {     super.init()     manager.delegate = self   }   func requestLocation() {     manager.requestLocation()   }   func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {     print("hehe")     location = locations.first?.coordinate   } } In the view. I have some custom button that when clicked, will call locationManager.requestLocation() but it gives this error message Updates[14291:194102] *** Assertion failure in -[CLLocationManager requestLocation], CLLocationManager.m:1339 *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Delegate must respond to locationManager:didFailWithError:' *** First throw call stack: ( 0  CoreFoundation           0x0000000111b3a8cb __exceptionPreprocess + 242 1  libobjc.A.dylib           0x000000010d4efba3 objc_exception_throw + 48 2  Foundation             0x0000000116b3837c _userInfoForFileAndLine + 0 3  CoreLocation            0x000000010c1baf65 CLClientStopVehicleHeadingUpdates + 52782 7  SwiftUI               0x0000000113c6f5dc __swift_memcpy160_4 + 113486 8  SwiftUI               0x0000000113c6fe8d __swift_memcpy160_4 + 115711 9  SwiftUI               0x0000000113c6fdff __swift_memcpy160_4 + 115569 10 SwiftUI               0x00000001140a4270 objectdestroy.142Tm + 41347 11 SwiftUI               0x00000001140a4284 objectdestroy.142Tm + 41367 12 SwiftUI               0x00000001140a4270 objectdestroy.142Tm + 41347 13 SwiftUI               0x0000000113dba491 block_destroy_helper + 36990 14 SwiftUI               0x0000000113db9df2 block_destroy_helper + 35295 15 SwiftUI               0x0000000113f4b7a5 _callVisitToolbarContentType2 + 4011 16 SwiftUI               0x00000001146fa7c8 _callVisitStyleContextType2 + 11258 17 SwiftUI               0x00000001146f8e5e _callVisitStyleContextType2 + 4752 18 SwiftUI               0x00000001146f8f42 _callVisitStyleContextType2 + 4980 19 SwiftUI               0x00000001146f8720 _callVisitStyleContextType2 + 2898 20 UIKitCore              0x0000000120b384b9 -[UIGestureRecognizer _componentsEnded:withEvent:] + 153 21 UIKitCore              0x00000001211d7ebd -[UITouchesEvent _sendEventToGestureRecognizer:] + 662 22 UIKitCore              0x0000000120b286f7 -[UIGestureEnvironment _updateForEvent:window:] + 469 23 UIKitCore              0x000000012117aedb -[UIWindow sendEvent:] + 5282 24 UIKitCore              0x000000012114e7f2 -[UIApplication sendEvent:] + 898 25 UIKitCore              0x00000001211f5e61 __dispatchPreprocessedEventFromEventQueue + 9381 26 UIKitCore              0x00000001211f8569 __processEventQueue + 8334 27 UIKitCore              0x00000001211ee8a1 __eventFetcherSourceCallback + 272 28 CoreFoundation           0x0000000111a9a035 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17 29 CoreFoundation           0x0000000111a99f74 __CFRunLoopDoSource0 + 157 30 CoreFoundation           0x0000000111a997d1 __CFRunLoopDoSources0 + 308 31 CoreFoundation           0x0000000111a93e73 __CFRunLoopRun + 927 32 CoreFoundation           0x0000000111a936f7 CFRunLoopRunSpecific + 560 33 GraphicsServices          0x000000011985b28a GSEventRunModal + 139 34 UIKitCore              0x000000012112d62b -[UIApplication _run] + 994 35 UIKitCore              0x0000000121132547 UIApplicationMain + 123 36 SwiftUI               0x00000001146b2cfb __swift_memcpy93_8 + 10826 37 SwiftUI               0x00000001146b2ba8 __swift_memcpy93_8 + 10487 38 SwiftUI               0x0000000113d68b7d __swift_memcpy195_8 + 12271 41 dyld                0x000000010be3d2bf start_sim + 10 42 ???                 0x0000000203a3d310 0x0 + 8651002640 ) libc++abi: terminating with uncaught exception of type NSException Message from debugger: Terminated due to signal 6 I really have no clue what is going on. It does not enter some breakpoint, it just crashes. Anything I am missing? Also, i could not find anything in the LocationManager regarding a callback when the location is retrieved? or it is a manual workaround that has to be done for this case? the issue may be because i need to include the function func locationManager( _ manager: CLLocationManager, didFailWithError error: Error ) but adds another question. Why do i get Error Domain=kCLErrorDomain Code=1 "(null)"
3
1
2.4k
Nov ’22
Callback Function As Parameter
My sample function is this func temp(type: String, callback: (() -> Void)? = nil) { callback?() } But why can't I do this? temp(type: "Here", () -> { print("hey") }) It says, Expected type after '->' While this does work temp(type: "Here", { () -> Void in print("hey") }) I find it weird why the () -> Void has to be inside the closure.
3
0
2.9k
Feb ’23