Force a Save on a Document Based iOS App in SwiftUI

Currently, I am developing a small document based App for iOS with SwiftUI. I was quite surprised to see that there is no obvious way to save the document’s contents to file after editing. In fact, the default behaviour was that nothing was saved at all after editing my document’s content. On macOS there is at least the possibility to update the change count to force a save later but that is not available on iOS SwiftUI.

Well, there is this hint on stackoverflow to register an undo at the UndoManager even if you do not use it. For some Views that worked for me; for others it didn’t. I was getting tired to spend hours in investigating why this was so. So I was looking for a way to save the document’s content explicitly. This is what I came up with.

Weiterlesen

Restore Window Size on MacCatalyst Apps

Sometimes its easier to just enable MacCatalyst on an iOS app to bring it to the Mac than to fiddle around with a dedicated Mac target or using the Mac version of SwiftUI. The drawback is that you don’t have access to AppKit but have to stick with UIKit / SwiftUI. So some quite useful features of AppKit are not available in MacCatalyst.

E.g. there is this nice AppKit construct to save and restore the window size and position between app launches:

But there is no equivalent in MacCatalyst since iOS apps don’t mess around with windows. In this post I’ll show how to achieve a similar behaviour in MacCatalyst.
Weiterlesen

An improved version of OutlinePicker

I’ve promised to present an improved version of the OutlinePicker shown in this post and here it is. What did I do?

  1. The parameter list changed a little bit. Now there’s a special title for „No Selection“ and we do not need the isExpanded parameter anymore since we want to expand the nodes automatically according to the selection.
  2. I’ve introduced the new array nodesToExpand. I’ll come back to that a little bit later.
  3. Instead of a sheet the selection view is presented as a popover (WithPopover from this post). Using that we do not need a close button anymore.
  4. The NodeOutlineGroup from this post is used to accept the array of expanded nodes.
  5. Instead of a Form I use a List here with a plain listStyle. That looks better in the popover view.
  6. The „No Selection“ section is now separated from the list in a similar manner as a Divider would do it in a Picker view.

Weiterlesen

An improved version of NodeOutlineGroup

This is the second post of my little series about a fine-tuned version of my OutlinePicker. Today, I’d like to propose an improved version of the already presented NodeOutlineGroup. As stated here the NodeOutlineGroup gives you control whether the disclosure group should be collapsed or expanded on show up of the outline group. I want to use that for my hierarchical picker. But on start of my picker the pre-selected node might be deep in the tree instead of being one of the root nodes.

So, if I set up the picker with all nodes collapsed the pre-selected node would not be visible immediately and the user might search for it for quite a long time. On the other hand, if I expand all nodes it might be quite a big tree to display on startup. The ideal solution would be that all nodes are collapsed except to those ones which have the selected node as a child or grand child.

Weiterlesen

WithPopover

In this last post I‘ve proposed an OutlinePicker for SwiftUI. But, to be honest, I am not quite satisfied with this solution. The selection view appears as a sheet in contrast to the standard picker and its layout deserves some more fine tuning.

The problem with the standard popover modifier in SwiftUI is that it’s mutated to a sheet presentation on iPhones. I know, there is this new modifier presentationCompactAdaptation(horizontal:vertical:) but that’s only available since iOS16.4. In addition, I want to use a List in the popover and that’s collapsed to a tiny square if you do not specify a frame size. To make a long explanation short: I prefer to use the nice utility view „WithPopover“ for the presentation of my picker selection.

Weiterlesen