Simple Animations on macOS (Swift 3)

If you’ve ever coded for iOS you’ll most likely be familiar with the UIView animateWithDuration function. Wouldn’t it be great if there would be an OSX equivalent?

Well, there sure is, just type the following:

        NSAnimationContext.runAnimationGroup({_in

            //Indicate the duration of the animation

            NSAnimationContext.current().duration = 5.0 

            //What is being animated? In this example I’m making a view transparent

            someView.animator().alphaValue = 0.0 

        }, completionHandler:{ 

            //In here we add the code that should be triggered after the animation completes.

            print(“Animation completed”)

        })

 

That’s it, you’re good to go! Questions / comments? I’m at @MarcMasVi 

 

Marc

 

Are we (NSViewController view) the First Responder?

In some cases a class may want to know if it’s the first responder before triggering an action.

For instance if several loaded View Controller classes are listening for the same notification, how can they know which one should trigger the action? Well… they should ask their view. 

In this case a NSTableView class is asking if it’s currently the first responder:

        if (self.view.window?.firstResponder == self.tableView){

            triggerFunctionHere()

        }

And that’s it 🙂

Questions / comments? I’m at @MarcMasVi 

Marc

Undo functionality in Core Data (Swift 3)

If you’re developing a Core Data based application for Mac, wouldn’t it be great if you could add undo support?

Well, turns out that is a couple of lines away. Follow the simple steps:

1. Make sure your managedObjectContext has an undo manager, without it Core Data can’t keep track of the changes:

         managedObjectContext?.undoManager = UndoManager() 

2. In the viewController where you should handle the undo operation just add:

      func undo(_ sender: AnyObject?){

  

        coreDataHelper.managedObjectContext.undoManager?.undo()

 

        refreshTable() //If applicable (for instance if you don’t use bindings)

        re-fetch the information and reload the table. This is what this

        function does in my code

 

      }

And that’s it, now you have full undo functionality! You’ll see how in the menus Undo no longer appears greyed out.

Questions / comments? I’m at @MarcMasVi 

Marc

Testing launch experience for a Mac app

In iOS it’s quite easy, you just delete the app and all of it’s data is removed as well. But how do you do it in OSX? Well, you should remove:

~/Library/Application Support/<YOUR OSX APP BUNDLE NAME>/

for example, by default should be:

~/Library/Application Support/com.yourcompany.yourapp/

And this is it! I suggest you do a Project -> Clean Build folder (to see this option you will have to press Alt while in the Porject menu) afterwards, just to be sure. 

Questions / comments? I’m at @MarcMasVi 

Marc

 

Scheduled notifications in macOS

Notifications are a very useful addition to macOS applications, when done right can help inmensly. 

Here’s how you create scheduled and immediate notifications. Let’s start with the immediate ones:

func triggerNotification() -> Void {

    let notification = NSUserNotification()

    notification.title = “titleOfNotification”

    notification.informativeText = “whateverTextYou WantToAdd”

    notification.soundName = NSUserNotificationDefaultSoundName

    NSUserNotificationCenter.defaultUserNotificationCenter().deliverNotification(notification)

}

This will trigger a notification the moment you execute it, if however you would like to schedule a notification for a later date you can do:

func showNotification(atDate: NSDate) -> Void {

    let notification = NSUserNotification()

    notification.title = “It’s MONTH”

    notification.informativeText = “Time to check your finances!”

    notification.soundName = NSUserNotificationDefaultSoundName

    notification.deliveryDate = NSDate().dateByAddingTimeInterval(5.0)

    //notification.deliveryDate = getDateOfNextNotification()

    NSUserNotificationCenter.defaultUserNotificationCenter().scheduleNotification(notification)

}

In this case you would be showing the notification after 5 seconds, more useful though is to plan it for a later date, like you can see in my commented code. The getDateOfNextNotification function simply returns the NSDate where I would like the notification to trigger. 

If you plan to use this, for instance in App Delegate, you may want to check if you have already scheduled notification to avoid duplicates. You can do the following:

func scheduleUpcomingAlertNotification() -> Void {

    let pipeOfNotifications = NSUserNotificationCenter.defaultUserNotificationCenter().scheduledNotifications.count

    if( pipeOfNotifications > 0){

        return

    }else trigger the function

Questions / comments? I’m at @MarcMasVi 

Marc