My first native iOS app - Death Clock

This post is more than 2 years old.

A few days ago I returned from a week of Objective-C and iOS training. I wanted to build an app on my own just to see what I could do and how comfortable I felt with the technology away from the Nerd Ranch. While it isn't pretty and the code is probably wrong in multiple ways, I've been able to create a native version of the Death Clock.

I used a UINavigationController to handle my views. I like the simple push, pop architecture and that you can disable the navigation bar. I wanted a "full screen" view for my application so that was important. The application is split into two sections. The initial screen is a simple config.

For the application I decided to only use birthdate and not gender. I wish there was a bit more control over the data picker widget. It seems huge to me. I spent about 30 seconds on the button so pardon the low tech look. The application also makes use of NSUserDefaults to record your birthdate for future loads. Want to see what this screen looks like? Check it out:

//
//  RKCConfigViewController.m
//  Death Clock
//
//  Created by Raymond Camden on 3/24/14.
//  Copyright (c) 2014 Raymond Camden. All rights reserved.
//

#import "RKCConfigViewController.h"
#import "RKCDeathClockViewController.h"

@interface RKCConfigViewController()

@property (nonatomic, weak) IBOutlet UIDatePicker *birthdayPicker;
@property (nonatomic, weak) IBOutlet UIButton *startDeathClock;
@property (nonatomic, strong) NSDate *birthday;

@end

@implementation RKCConfigViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    
    if (self) {
        //check for default
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        NSDate *defaultBD = [defaults objectForKey:@"Birthday"];
        NSLog(@"%@", defaultBD);
        if(defaultBD) _birthday = defaultBD;
        else _birthday = [[NSDate alloc] init];
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    //no times, just m/d/y
    _birthdayPicker.datePickerMode = UIDatePickerModeDate;
    _birthdayPicker.date = _birthday;
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    //you weren't born in the future
    self.birthdayPicker.maximumDate = [[NSDate alloc] init];
    //set an initial data
    _birthday = [[NSDate alloc] init];
}

- (IBAction)setBirthDay:(id)sender
{
    _birthday = self.birthdayPicker.date;
    NSLog(@"Set bday for %@", self.birthday);

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:_birthday forKey:@"Birthday"];

}

- (IBAction)startDeathClock:(id)sender
{
    NSLog(@"CLICK ME BABY");
    RKCDeathClockViewController *dvc = [[RKCDeathClockViewController alloc] init];
    dvc.birthday = _birthday;
    [self.navigationController pushViewController:dvc animated:NO];
}

@end

The second view is the actual counter. This isn't terribly exciting. I've got the actual death date and then the number of seconds.

And that's it. Want to see all the code? I created a new GitHub repo so I could store my examples. To be clear, do not consider this anything near "good" iOS programming. I just wanted to share.

Objective-C Examples

Later this week I think I may try to get this into the App Store. I figure I don't have much chance of it being accepted, but it can't hurt, right?

Raymond Camden's Picture

About Raymond Camden

Raymond is a developer advocate for HERE Technologies. He focuses on JavaScript, serverless and enterprise cat demos. If you like this article, please consider visiting my Amazon Wishlist or donating via PayPal to show your support. You can even buy me a coffee!

Lafayette, LA https://www.raymondcamden.com

Archived Comments

Comment 1 by Phillip Senn posted on 3/25/2014 at 7:45 PM

Ah, the more things change, the more they stay the same.

Comment 2 by Dom Howard posted on 3/25/2014 at 8:12 PM

As long as it's not a fart app, you'll be fine

Comment 3 by John Hattan posted on 3/25/2014 at 8:53 PM

I have a similar app that I released for Android. It has a sea of one-star reviews, mostly from people who say it scares the crap out of them :)

http://www.amazon.com/gp/pr...

Comment 4 by Raymond Camden posted on 3/25/2014 at 8:59 PM

John, back when I created Death Clock (originally it was a Perl script, than ColdFusion, than JavaScript), I used to get such letters/reviews all the time. People can't seem to separate a web site from reality. ;)

Comment 5 by Ty Whalin posted on 3/26/2014 at 2:06 PM

Not sure I have a use for it but cool.

Comment 6 by Jay Van Voast posted on 3/26/2014 at 6:04 PM

Where was the Objective-C and iOS training? And was it worth it?

Comment 7 by Raymond Camden posted on 3/26/2014 at 6:11 PM

@Jay: Please see the first link in the blog article. I wrote a lengthy review of the course.

Comment 8 by Jay Van Voast posted on 3/26/2014 at 6:20 PM

Thanks Ray I must have missed that post. Thanks again for all you do!

Comment 9 by John C. Bland II posted on 3/26/2014 at 10:56 PM

Why didn't want the navigation controller to animate?

Comment 10 by Raymond Camden posted on 3/26/2014 at 10:57 PM

There was a bug where when the black counter screen came in, it was visible "beneath" the white view. I fixed that bug and it animates now.

Comment 11 by John C. Bland II posted on 3/26/2014 at 11:05 PM

Gotcha. There are some definite issues w/ animating a nav controller for custom/transparent backgrounds. I have some code I'm going to push out as an example to show an easy way around it, if I can get a moment to breathe.

Also, you might want to call synchronize on your defaults:
[defaults synchronize];

That will write the values immediately. It is called at regular intervals anyway but in the event you wanted the RKCDeathClockViewController to load the value vs passing it in, you'd want to sync it immediately so the value is saved by time it is read.

Comment 12 by Raymond Camden posted on 3/26/2014 at 11:07 PM

Cool tips - thanks! Added and pushed.

Comment 13 by John C. Bland II posted on 3/26/2014 at 11:29 PM

No prob man. I'm steadily learning more and more since I'm doing this 100% of the time at work now. It is time for me to start blogging/sharing, which sparks convo and helps spur more growth.