When you have to use UserDefaults to share data between a core app and a widget you have to do a couple of things.
Inside of the project Signing & Capabilities use the Add Capabilities button to add App Group. You need to do this while selecting both the app target and the widget target.
extension UserDefaults {
static let custom: UserDefaults = {
let appGroupId = "group.tech.justins.BowlingScoreTracker"
return UserDefaults(suiteName: appGroupId)!
}()
}
Now anywhere in the app where you set or get from UserDefaults just use .custom instead of .default. And that will synchronize across both of them.
Apple’s built in stepper allows you to only have one step increment value, I’ve designed on that allows for two different increment values. Initial version supported 1 and 10 for the step values and is tied to an integer.
When building a page with a Linear Progress bar, I thought it should have been partially filled and it wasn’t filled at all. Turns out it expected value to be between 0-100 and I was assuming it would have been 0-1. Best to check the documentation over just guessing, but we all know developers hate reading the documentation. So best do some tests to see which range it expects.
When you want to debug certain sections of code with in an environment without restarting Apache or NGINX, there’s a template I use for displaying print messages.
When you use Measurement format function in Swift it will always format the temperature to the format of the locale of the device. This is not the experience I wanted in my application. I wanted to provide the user an option to chose which scale they wanted to use, so I had to override the format operation. I used the following function to make this happen.
Some of the biggest things that bug me as a user of software is how they handle errors. Apple has been known for silently handling errors and not telling users that something went wrong, this is bad. Another example of bad user handling is how Git Kraken handles theirs, they have a toast in the lower left that disappears after a duration of time. Both of these are really frustrating to the user of the software.
The best way to handle errors is to provide clear and copy-able error messages for your user. You could provide this using an alert, clearly visible logs, or a (persistent until dismissed) toast message in the corner. How ever you do this, provide a way that the user can take the error to Google afterwards. I prefer the alert method so that I am forced to acknowledge that an error has occurred.
Sometimes when you are using php you need to change some of the settings, this can be done by using the ini file.
Before you change anything in the ini file you should check the phpinfo. This can be done by creating a file containing <?php phpinfo(); ?> and then navigating to the path for that file in a browser.
Once you have confirmed where the php ini file is, make your changes. To apply these changes you will have to restart apache. The code to do this depends on which platform you are running. One of the common ones can be done by systemctl restart apache2. Hope this helps someone.
When you write if/else statements please put your else block on a new line not on the same line. The following doesn’t work with certain editor for code block collapsing.