Post

Replies

Boosts

Views

Activity

Diffable data source with fetched result controller on iOS 15
Hi! When using a diffable data source on iOS 13 and iOS 14 in combination with a fetched result controller, the didChangeContentWith method of the NSFetchedResultsController delegate return a new snapshot with inserted, deleted and moved items. Unfortunately, in the new snapshot items that have been modified are not refreshed. That's because the system appears to compare the identifiers to determine whether a refresh is needed or not. If we change an attribute of a Core Data entity the identifier remain the same and the item in the snapshot is not refreshed. For this reason, on iOS 13 and iOS 14, we need to manually check which objects have been updated and manually refresh the corresponding items in the snapshot. Now, it seems that on iOS 15 this is no more needed. The new snapshot I receive in the NSFetchedResultsController didChangeContentWith delegate method also contain refreshed items. So, in order to apply the new snapshot I only need to call a single line of code: func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChangeContentWith snapshot: NSDiffableDataSourceSnapshotReference) { guard let diffableDataSource = diffableDataSource else {return} diffableDataSource.apply(snapshot as NSDiffableDataSourceSnapshot<Section, NSManagedObjectID>, animatingDifferences: true) } That's great, but I'm not sure if that's a feature we can count on from iOS 15 onwards. Is this new behaviour documented somewhere? Thank you
4
0
2.8k
Oct ’21
supplementarySidebarTrackingSeparatorItemIdentifier
I'm developing an iOS 14 Catalyst app and I'm trying to setup the window toolbar. I created a NSToolbar and assigned to the scene window titlebar property. var toolbarDelegate = ToolbarDelegate() func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { #if targetEnvironment(macCatalyst) guard let windowScene = scene as? UIWindowScene else { return } let toolbar = NSToolbar(identifier: "main") toolbar.delegate = toolbarDelegate toolbar.displayMode = .iconOnly if let titlebar = windowScene.titlebar { titlebar.toolbar = toolbar titlebar.toolbarStyle = .unified titlebar.titleVisibility = .hidden } #endif } I then assigned some items to the toolbar via the toolbarDefaultItemIdentifiers delegate method. func toolbarDefaultItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] { let identifiers: [NSToolbarItem.Identifier] = [ .toggleSidebar, .print, .flexibleSpace, .print ] return identifiers } This work as expected. Now, let's say that I want to align some items with the edges of the supplementary column. I found that there is an NSToolbarItem named supplementarySidebarTrackingSeparatorItemIdentifier. This item appears to allow us to align items with the supplementary column. If I do this: func toolbarDefaultItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] { let identifiers: [NSToolbarItem.Identifier] = [ .toggleSidebar, .flexibleSpace, .print, .supplementarySidebarTrackingSeparatorItemIdentifier, .print, .flexibleSpace, .print ] return identifiers } I got the following result which is exactly what I want to achieve (the items are aligned with the supplementary column): But there are some issues. As you can see from the above image for some reason the background color of the toolbar on top of the supplementary column become white. But it's worse. If I resize the window the background instantly become gray: If I then scroll the content of the supplementary column the toolbar become white again. Another issue is that If I collapse the primary column the toolbar on top of the supplementary column loose the right separator line. Why? I tried to search some info online but if I try to search for supplementarySidebarTrackingSeparatorItemIdentifier I got only 5 results! One of these is Apple's official documentation page, which does not contain any info about the behaviour of this item: Apple documentation about supplementarySidebarTrackingSeparatorItemIdentifier At this point I wonder if this item is ready to be used in real apps. Someone has experience using the supplementarySidebarTrackingSeparatorItemIdentifier item? There is a way to align toolbar items with the supplementary column without having the above described issues? (different toolbar background color, missing toolbar separator line) Thank you
1
0
1.5k
Aug ’21
Inline or compact UIDatePicker with white tint color
If we use white as tint color for an inline or compact UIDatePicker (iOS 14, dark mode) then if the today day is selected the number become unreadable. The problem is that the today day number color is always white and, when selected, the background color is also white. Anyone know a way to set the color of today's day number to black when is selected? Thank you
6
0
3k
Aug ’21
Incorrect height of iPad floating keyboard
I'm using the following code to get the height of the keyboard: class ViewController: UIViewController {     override func viewDidLoad() {         super.viewDidLoad()         NotificationCenter.default.addObserver(             self,             selector: #selector(keyboardHeight),             name: UIResponder.keyboardDidChangeFrameNotification,             object: nil         )     }     @objc private func keyboardHeight(notification: Notification) {         guard let keyboardRect = (notification.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else { return }         print("==> keyboardFrameEndUserInfoKey height: \(keyboardRect.size.height)")     } } This code on iPad work correctly when the keyboard is normal but it does not work when the keyboard is floating. After the user tap on a text field, the keyboard appear and the keyboardDidChangeFrameNotification notification is called. If the keyboard is floating then the first time we get a wrong height of 362. If the user then manually move somewhere the floating keyboard the notification is called again and the correct value of 308 is returned. It is a bug or I miss something? I need to be able to get the correct height the first time the keyboard appear. This is happening on iOS 13 and iOS 14. Any idea?
1
1
1.3k
Jul ’21
Animated gifs in forum posts
Hi, Sometimes it is useful to show a movie to better explain the behaviour of something. Animated gifs would be perfect for this purpose. Unfortunately it doesn't seem possible to include animated gifs in posts. When I try to do it (using the "Add Image" feature) I always got this error message: Will the attachment of animated gifs be supported in the future? If not, what is the recommended way to include a short movie in a post? Thank you
3
0
744
Jul ’21
iOS 15 navigation bar transition between large title and small title
Hi, On iOS 13 and iOS 14, if you have a navigation controller that use large titles and you push a controller that does not want a large title (navigationItem.largeTitleDisplayMode = .never) there is a smooth animation between the two navigation bar heights (from the large one to the small one). On iOS 15 the animation is missing and during the transition the pushed controller view top part is covered by the large title bar until the end of the transition. After the animation is done the height of the navigation bar suddenly becomes small. Here's the transition on iOS 14. The navigation bar height gradually changes from large to small: And here's the transition on iOS 15. The navigation bar height is not animated and remains the same until the end of the transition animation: I opened a bug report regarding this issue (FB9290717) but I want to know if someone has found a temporary fix for this. Thank you
2
0
3.0k
Jul ’21
Push many views into NavigationView
Hi, I want to present four view one after the other. The user should be able to move between views by clicking on a NavigationLink inside the navigation bar. Below you can find the sample code. Unfortunately I struggle to get it to work properly. When the user tap on "To second" the second view is correctly pushed into the navigation stack. But when the user press on "To third" or "To fourth" something strange happens. There is no transition animation and the back button is not updated. If the user tries to return to the previous view by pressing the back button it will be sent to the first view. There is something I'm doing wrong? Here is the code: struct FirstView: View { &#9;&#9;var body: some View { &#9;&#9;&#9;&#9;NavigationView { &#9;&#9;&#9;&#9;&#9;&#9;Text("First view\n\nIf you press on \"To second\" the second view is correctly presented.") &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;.navigationBarTitle(Text("First view"), displayMode: .inline) &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;.navigationBarItems(trailing: &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;NavigationLink("To second", destination: SecondView()) &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;) &#9;&#9;&#9;&#9;} &#9;&#9;} } struct SecondView: View { &#9;&#9;var body: some View { &#9;&#9;&#9;&#9;Text("Second view\n\nIf you press on \"To third\" the view is presented without animation.") &#9;&#9;&#9;&#9;&#9;&#9;.navigationBarTitle(Text("Second view"), displayMode: .inline) &#9;&#9;&#9;&#9;&#9;&#9;.navigationBarItems(trailing: &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;NavigationLink("To third", destination: ThirdView()) &#9;&#9;&#9;&#9;&#9;&#9;) &#9;&#9;} } struct ThirdView: View { &#9;&#9;var body: some View { &#9;&#9;&#9;&#9;Text("Third view\n\nIf you press on \"To fourth\" the view is presented without animation.\n\nThe back button is not updated and if you press on it you are not redirected to \"Second view\" but to \"First view\".") &#9;&#9;&#9;&#9;&#9;&#9;.navigationBarTitle(Text("Third view"), displayMode: .inline) &#9;&#9;&#9;&#9;&#9;&#9;.navigationBarItems(trailing: &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;NavigationLink("To fourth", destination: FourthView()) &#9;&#9;&#9;&#9;&#9;&#9;) &#9;&#9;} } struct FourthView: View { &#9;&#9;var body: some View { &#9;&#9;&#9;&#9;Text("Fourth view\n\nThe back button is not updated and if you press on it you are not redirected to \"Third view\" but to \"First view\".") &#9;&#9;&#9;&#9;&#9;&#9;.navigationBarTitle(Text("Fourth view"), displayMode: .inline) &#9;&#9;} }
1
0
2.5k
Oct ’20
List row stay selected after back
Hi, I found a case that cause a list to never deselect the row when the back button is pressed. In the following code I modally present a list. When you select a row another list is displayed. If you select a row of the second list and you go back the row will stay selected. This is the code: struct ContentView: View { &#9;&#9;@State var modalVisible = false &#9;&#9;var body: some View { &#9;&#9;&#9;&#9;Button(action:{ &#9;&#9;&#9;&#9;&#9;&#9;self.modalVisible.toggle() &#9;&#9;&#9;&#9;}) { &#9;&#9;&#9;&#9;&#9;&#9;Text("Open modal") &#9;&#9;&#9;&#9;} &#9;&#9;&#9;&#9;.sheet(isPresented: $modalVisible) { &#9;&#9;&#9;&#9;&#9;&#9;NavigationView { &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;List { &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;NavigationLink("Item", destination: List { &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;NavigationLink("Sub Item", destination: Text("If you go back the row will stay selected.")) &#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;&#9;})                 }             }         }     } } Does anyone know if there is a way to force the list to deselect the row when the back button is pressed? Thank you
2
0
2.2k
Oct ’20
SwiftUI DatePicker with inline style
Hi, I want to set the style of a DatePicker to inline but I can't figure out how to do it. My DatePicker is defined like this: DatePicker("Time", &#9; selection: $time, &#9; displayedComponents: [.hourAndMinute]) &#9; .pickerStyle(InlinePickerStyle()) Unfortunately the picker is not really displayed inline because when the user tap on it the picker is presented modally over a blurred background. I tried to change the available picker styles but the result is always the same. I want to achieve what Apple did in the Remainders App. Here when you activate the "Date" or "Time" switch a date picker is displayed inline. Can anyone help me? Thank you
1
0
3k
Oct ’20
Form NavigationLink issue
Hi, Sorry for the long post but I have an issue with SwiftUI that is driving me crazy. Let's take this example view: struct TestNumberPicker: View { &#9; @State private var number = UserDefaults.standard.integer(forKey: "number") &#9; var body: some View { &#9;&#9;&#9;VStack { &#9;&#9;&#9;&#9; Stepper("Number", value: $number, in: 0...240, step: 5) &#9;&#9;&#9;&#9; Text("Selected number: \(number)") &#9;&#9;&#9;} &#9;&#9;&#9;.onChange(of: number, perform: { newNumber in &#9;&#9;&#9;&#9; UserDefaults.standard.setValue(newNumber, forKey: "number") &#9;&#9;&#9;}) &#9; } } The view has a state variable named "number" initialized with a value readed from the UserDefaults. This variable is linked to a Stepper. When the value of "number" is changed a block is executed to save the new value in the UserDefaults. Now, this works correctly if for example this view is presented modally but it doesn't work anymore if the view is presented via a NavigationLink, like this: struct TestForm: View { &#9; var body: some View { &#9;&#9;&#9;NavigationView { &#9;&#9;&#9;&#9; Form { &#9;&#9;&#9;&#9;&#9;&#9;NavigationLink("Pick a number", destination: TestNumberPicker()) &#9;&#9;&#9;&#9; } &#9;&#9;&#9;&#9; .navigationBarTitle(Text("Test"), displayMode: .inline) &#9;&#9;&#9;} &#9; } } The first time the view is displayed everything work as expected but if I tap on back and I select again the NavigationLink something weird appends. The "number" variable is reset to the original value. This is an example: I tap on the navigation item. The view is displayed. The "number" variable is initialised with 10 (read from the UserDefaults). I tap once on the stepper (+). The "number" variable become 15. The view is displaying "Selected number: 15" The UserDefaults save 15 (confirmed by reading the plist file). I tab on back. I tap again on the NavigationItem. The view is displayed but the "number" variable contain 10 instead of 15! I believe the problem has to do with NavigationLink not lazy loading the view. In fact if I forces the view to load lazy: struct TestForm: View { &#9; struct LazyView<Content: View>: View { &#9;&#9;&#9;let build: () -> Content &#9;&#9;&#9;init(_ build: @autoclosure @escaping () -> Content) { &#9;&#9;&#9;&#9; self.build = build &#9;&#9;&#9;} &#9;&#9;&#9;var body: Content { &#9;&#9;&#9;&#9; build() &#9;&#9;&#9;} &#9; } &#9; var body: some View { &#9;&#9;&#9;NavigationView { &#9;&#9;&#9;&#9; Form { &#9;&#9;&#9;&#9;&#9;&#9;NavigationLink("Pick a number", destination: LazyView(TestNumberPicker())) &#9;&#9;&#9;&#9; } &#9;&#9;&#9;&#9; .navigationBarTitle(Text("Test"), displayMode: .inline) &#9;&#9;&#9;} &#9; } then everything work as expected. What is exactly the problem? It is something I'm doing wrong? Thank you
0
1
1k
Oct ’20
View with a binding and a private property
Hi, I'm learning SwiftUI and there are still some things I don't understand very well. For example, this is compiling correctly: struct Test: View {     private var testPrivateProperty = 1     var body: some View {         Text("Test")     } } struct Test_Previews: PreviewProvider {     static var previews: some View {         Test()     } } This is also compiling correctly: struct Test: View {     @Binding var testBinding: Bool     var body: some View {         Text("Test")     } } struct Test_Previews: PreviewProvider {     static var previews: some View {         Test(testBinding: .constant(true))     } } But if I create a View that contain both a binding and a private property: struct Test: View {     @Binding var testBinding: Bool &#9;&#9;private var testPrivateProperty = 1     var body: some View {         Text("Test")     } } struct Test_Previews: PreviewProvider {     static var previews: some View {         Test(testBinding: .constant(true)) &#9;&#9;&#9;&#9;//Error on the line above.     } } the compiler produce this error: 'Test' initializer is inaccessible due to 'private' protection level Can anyone help me understand why? Thank you
1
0
3.4k
Oct ’20
UITabBarController is unsupported as viewController
Hi, I'm testing one of my app on iOS 14 with Xcode 12 beta 3 (12A8169g) and I have a problem with my storyboards. Xcode give me this error for all the storyboards that contain a split view controller: An internal error occurred. Editing functionality may be limited. The log generated by the Xcode "Report a bug" button say: Exception name: NSInvalidArgumentException Exception reason: UITabBarController is unsupported as viewController for -[UISplitViewController setViewController:forColumn:] in Primary column It worked correctly on Xcode 12 beta 2. Has anyone encountered the same problem and found a way to fix it? Thank you
7
0
2.8k
Aug ’20
Weird SIGTRAP during tableView scroll
Hi!I hope someone can help me.A user told me that my app crashes when scrolling a tableView on iOS 13.1.2.I received the crash log and the error it’s just crazy.The crash log indicate that the error is at the first line inside the trailingSwipeActionsConfigurationForRowAt method.override func tableView(_ tableView: UITableView, trailingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -&gt; UISwipeActionsConfiguration? { guard items.count &gt; indexPath.row else {return nil} //This line crash. … }The items property is defined as:private var items = [AnyObject]()The error is EXC_BREAKPOINT (SIGTRAP).How can this line of code crash? items is a non optional variable and indexPath is also a non optional struct.It's as if indexPath.row was deliberately creating an EXC_BREAKPOINT exception. It is possible?Another strange thing is that the user say that the app crash during scrolling. It seems that the method trailingSwipeActionsConfigurationForRowAt is called during scroll. That's also strange, it should not be called only when the user does a left swipe? Maybe it has something to do with some accessibility feature because in the call stack of crash report I see some system accessibility methods calls (see crash report below).Has anyone any ideas that can help me or has encountered a similar problem?Thank youException Type: EXC_BREAKPOINT (SIGTRAP) Exception Codes: 0x0000000000000001, 0x00000001de522a94 Termination Signal: Trace/BPT trap: 5 Termination Reason: Namespace SIGNAL, Code 0x5 Terminating Process: exc handler [1431] Triggered by Thread: 0 Thread 0 name: Thread 0 Crashed: 0 libswiftUIKit.dylib 0x00000001de522a94 $s10Foundation9IndexPathV5UIKitE7sectionSivgTm + 52 1 libswiftUIKit.dylib 0x00000001de522a78 $s10Foundation9IndexPathV5UIKitE7sectionSivgTm + 24 2 MYAPP 0x000000010219ca4c specialized GroupTableViewController.tableView(_:trailingSwipeActionsConfigurationForRowAt:) + 272 (GroupTableViewController.swift:714) 3 MYAPP 0x0000000102194544 @objc GroupTableViewController.tableView(_:trailingSwipeActionsConfigurationForRowAt:) + 136 (:0) 4 UIKitCore 0x00000001ad6ae200 -[UITableView _trailingSwipeConfigurationAtIndexPath:fromRemoveButton:] + 2140 (UITableView.m:16580) 5 UIKit 0x00000001de7889f0 -[UITableViewCellAccessibility _privateAccessibilityCustomActions] + 544 (UITableViewCellAccessibility.m:3153) 6 UIAccessibility 0x00000001b49e6228 -[NSObject(AXPrivCategory) _retrieveCustomActionsForElement:] + 72 (NSObjectAccessibility.m:2973) 7 UIAccessibility 0x00000001b49e650c -[NSObject(AXPrivCategory) _accessibilityCustomActions] + 260 (NSObjectAccessibility.m:3021) 8 UIAccessibility 0x00000001b49e9978 -[NSObject(AXPrivCategory) _accessibilityCustomActionNamesAndIdentifiers] + 68 (NSObjectAccessibility.m:3683) 9 UIAccessibility 0x00000001b49f07bc -[NSObject(AXPrivCategory) _iosAccessibilityAttributeValue:] + 6580 (NSObjectAccessibility.m:6542) 10 UIAccessibility 0x00000001b49d1d9c _copyMultipleAttributeValuesCallback + 544 (UIAccessibilityRuntime.m:344) 11 AXRuntime 0x00000001b39fc834 ___AXXMIGCopyMultipleAttributeValues_block_invoke + 64 (AccessibilityPriv.m:1192) 12 AXRuntime 0x00000001b39fc3a8 _handleNonMainThreadCallback + 68 (AccessibilityPriv.m:467) 13 AXRuntime 0x00000001b39fc6b8 _AXXMIGCopyMultipleAttributeValues + 304 (AccessibilityPriv.m:1191) 14 AXRuntime 0x00000001b39f658c _XCopyMultipleAttributeValues + 396 (AccessibilityClientDefsServer.c:1354) 15 AXRuntime 0x00000001b3a0bd28 mshMIGPerform + 272 (MachServerHelper.c:447) 16 CoreFoundation 0x00000001a939d91c __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 60 (CFRunLoop.c:1937) 17 CoreFoundation 0x00000001a939cfe8 __CFRunLoopDoSource1 + 448 (CFRunLoop.c:2075) 18 CoreFoundation 0x00000001a9397c20 __CFRunLoopRun + 2144 (CFRunLoop.c:3098) 19 CoreFoundation 0x00000001a9397098 CFRunLoopRunSpecific + 480 (CFRunLoop.c:3192) 20 GraphicsServices 0x00000001b3501534 GSEventRunModal + 108 (GSEvent.c:2246) 21 UIKitCore 0x00000001ad4b77ac UIApplicationMain + 1940 (UIApplication.m:4753) 22 MYAPP 0x000000010209cae8 main + 68 (PlaceViewController.swift:25) 23 libdyld.dylib 0x00000001a9216f30 start + 4
Topic: UI Frameworks SubTopic: UIKit Tags:
4
0
3k
Oct ’19
UIStepper do not respect tint color in iOS 13
Hi!Prior to iOS 13 it was possible to change the color of the text (+ and -) of a UIStepper by setting the desired color in the tintColor attribute.Unfortunately in iOS 13 (beta 7) this no longer works and the text color is always black.Has anyone found a way to change the stepper text color?Thank youAlan
5
1
5.7k
Aug ’19
hidesBottomBarWhenPushed animation issue on the iPhone X
Hi!I have an issue using the hidesBottomBarWhenPushed attribute on the iPhone X.If I set this attribute to true, when I push another controller on the iPhone X the toolbar is moving down during the animation. This is appening only on the iPhone X.I have made a video that show this behaviour. At the beginning you see the effect on a iPhone 8 and then on the iPhone X.http://www.dale1.ch/documents/hides-bottom-bar-when-pushed.movSomeone know a way to stop the toolbar from moving down during the animation?Thank youAlan
Topic: UI Frameworks SubTopic: UIKit Tags:
1
0
1.7k
Apr ’18