How to remove more than one item at once from Array with matching condition in Swift
byIn Swift most sequence collections provides removeAll(where:) - an efficient way to remove at once multiple items matching the coditional logic from collection.
In Swift most sequence collections provides removeAll(where:) - an efficient way to remove at once multiple items matching the coditional logic from collection.
Very common user experience we come across when using UITextField and UITextview is to limit the number of characters.
It’s implementation is straightforward using their standard delegates implementing either shouldChangeCharactersIn (for text fields) or shouldChangeTextIn (for text views).
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if (textField.text?.count ?? 0) + (string.count - range.length) >= characterLimit{
return false
}
return true
}
There is always a need to sort an array. What if array consists of custom objects? How do we sort array of custom objects by a property value? Let us find out!
const array = [
{ name: ‘John’, order: ‘2’ },
{ name: ‘Jack’, order: ‘1’ },
{ name: ‘James’, order: ‘10’ }
]
In my localhost server, remote push notifications worked fine. It had stopped working on the production server. I have designed a neat system to separate the development environment from production mode for testing remote push notifications. Different certificates are used automatically based on the running environment. Device tokens are stored in a database based on the nature of the iOS app’s distribution. It ensures sandbox mode uses debug-version of device tokens else we will be running often into the “Baddevice Token” response from the apns server.
The system is well-tested with time. Remote push notifications stopped working in production mode all of sudden. I am not using the third-party service to manage our push notifications. I have our well-designed and well-tested middleware to manage push notifications. It follows a modern recommendation from apple to use http/2 to process all requests to apns server. Many good tutorials out there on the subject. I will share my troubleshooting experience and its solutions.
I turned on the verbose settings to display every information of cURL execution. It gives insight on if the connection is going through the apns server and what response we get.
CURLOPT_VERBOSE => true
I was creating an admin dashboard based on Laravel. UI components were reactive and build upon the vuejs framework. I will have a post on my experience with the vuejs framework someday.
I was switching between a compilation of Vue component changes and running the laravel localhost server. A regular serve command to start localhost:
php artisan serve —host 192.168.10.203 —port 8000
I was serving at the IP address of the machine so I could test conveniently from other machines and devices connected to LAN.
Between development precess somehow the laravel artisan process mustn’t have closed properly. When I attempted to serve localhost I received this error:
Failed to listen on localhost:8000(reason: Address already in use)
We have used struct for purposes like small-scale copiable entity representing common-kinds-of-data. What if we want to make our custom struct model equatable? We want our struct to be analysed for basic equality of comparison. What if we have an array of struct and we want to perform some operation to array like sorting or create an unique array by removing duplicate structs.
We have seen this error shown when we try to perform such operation of comparison:
Type ‘CustomStruct’ does not conform to protocol ‘Hashable’
I have been ignoring the message to upgrade awsebcli tool for long time. This time I did not ignore and made an attempt to upgrade:
pip install --upgrade awsebcli
I got an error:
No matching distribution found for botocore<1.22.0,>=1.21.0 (from awsebcli)
There was also a little warning asking me to consider upgrading my existing pip installation. I upgraded pip with simple command.
pip install --upgrade pip --user
I made fresh attempt to upgrade awsebcli. I got same error telling me “No matching distribution found”
I found a suggestion in forum to try installing specific verion of awsebcli to overwrite current installation version. I did that:
sudo pip install --upgrade awsebcli botocore==1.19.63
I force upgraded to 1.19.63 which was still way higher than my existing version of awsebcli. It did installed successfully but also gave few errors:
ERROR: pip's legacy dependency resolver does not consider dependency conflicts when selecting packages. This behaviour is the source of the following dependency conflicts.
boto3 1.7.68 requires botocore<1.11.0,>=1.10.68, but you'll have botocore 1.19.63 which is incompatible.
awsebcli 3.20.2 requires botocore<1.22.0,>=1.21.0, but you'll have botocore 1.19.63 which is incompatible.
You might also like: HTTPS not working on AWS Elastic Beanstalk
It installed with errors. I verified installation by deploying my new update to beanstalk environment to see if awsebcli tool is working fine. It did not. I got this error:
File “/usr/local/bin/eb”, line 5, in
from ebcli.core.ebcore import main
File “/Library/Python/2.7/site-packages/ebcli/core/ebcore.py”, line 19, in
from ebcli.core import ebglobals, base, hooks
File “/Library/Python/2.7/site-packages/ebcli/core/hooks.py”, line 20, in
from ebcli.core import fileoperations
File “/Library/Python/2.7/site-packages/ebcli/core/fileoperations.py”, line 32, in
from json import load, JSONDecodeError
ImportError: cannot import name JSONDecodeError
Sometime there may be need to resize the image displayed in UIButton for not availability of proper sized image because of some reason. Wrong size gives unwanted results like stretched out image pixels etc. In this post we are assuming simple UIButton with image only.
btn.imageView?.contentMode = .scaleAspectFit
This will solve the 50% of problem because UIButton will render the image maintaining the aspect ratio.
Now if in worst case scenario problem isn’t solved because of bigger dimension of image then we have second solution:
Recently someone brought me a problem that needed my perspective. A vertical UICollectionView is using sections for displaying items. Requirement is to scroll to bottom of UICollectionView. A method that can be used used for scrolling to last item in UICollectionView is
scrollToItem(at indexPath: IndexPath,
at scrollPosition: UICollectionView.ScrollPosition,
animated: Bool)
This method worked incomplete. It made collection view to last item. Isn’t that what is required? There is a custom footer at the end of section and footer needs to be visible. It did not scroll to last footer but stopped just before footer.
To find the information regarding offset on our footer view we will gather layout information for that particular supplementary view. Remember supplementary view can be either header or footer so this works for both. Here is an extension to UICollectionView
Animation is a common feature we use often in our apps. iOS SDK does provide different ways to implement. From higher-level UIKit methods to more lower Core Animation. Any UIKit based animation is internally translated into core animations. UIKit methods abstracts the layer of core animation.
Today here we will see the higher-level UIKit animation’s equivalent in Android’s Kotlin - one of the ways that Android SDK provides us. We will use ViewPropertyAnimator - a simplified and optimised way to animate properties of a View in Android. A simple example to rotate a view by certain angle for a duration and also callback implementation when animation ends.
Below is the equivalent code snippet for Android Animation in Kotlin and iOS animation on views with UIKit.