Expected expression error when creating new variable in switch case block

So I am coding along in my iOS app and I come across an Expected expression error when I am creating a new variable in switch case block. For example, this looks innocent enough…

switch (actionType)
{
    case 0:
        NSArray *componentArray = [theString componentsSeparatedByString:@","];
        // do more stuff here
        break;
    // more cases here
}

No matter what I do, the Xcode compiler complains about the NSArray line right below the case 0 statement. What kind of horse hockey is this? The code is so simple that it is laughable.

My investigations led me to discover that there is a C compilation rule that specifies that you cannot have a variable declaration right after a label. And apparently, case statements are compiled into labels. (By exactly what sorcery escapes me, I am sure if you are interested you can dig into the C language definitions and figure it out.)

So I am forced to do this instead:

NSArray *componentArray;
switch (actionType)
{
    case 0:
        componentArray = [theString componentsSeparatedByString:@","];
        // do more stuff here
        break;
    // more cases here
}

BTW, Happy Birthday to Cheryl Burke, who is by far my favorite pro dancer on Dancing With The Stars. I hope Cheryl returns to the show at some point in the future.

Gee, I would have never guessed that password…

A password so insecure, it is secure.

wifi

BTW, Happy Earth Day to the citizens of planet Earth reading this message. (Which should be most of you.)

Shameless plug

Attention baseball fans! I’d like to take this opportunity to put in a shameless plug for an app near and dear to my heart.

I just released the 4.0 version of Pro Baseball Stats to the iTunes App Store. It is a free universal app for iPhone and iPad with iOS 7 or newer. If you are a baseball geek, please check it out.

BTW, a posthumous Happy Birthday to Jeff Healey, the fantastic blues guitarist who was taken from us far too soon.

Custom UITableViewCell with class and nib file

It is only a matter of time before you want to create a custom UITableViewCell with class and nib file on the iOS platform. There are a couple of things to keep in mind when doing this so that you do not bang your head against the wall, trying to figure out why it is not working.

In order to do this, you will probably create a .m and .h file for your code, and a .xib file for the UI. After creating a new nib file, you will have to remove the blank UIView and put a blank UITableViewCell on the design surface. Make sure to get into the habit right away of setting both the File’s Owner and the top level table view cell to your new class name.

Then, if you any IBOutlet controls, when you are assigning the pointers in Interface Builder, make sure that you are dragging to the top level cell and not the File’s Owner, otherwise you will get a crash when the cell is being built.

BTW, Happy Birthday to Gary Lockwood, most famously of 2001: A Space Odyssey and the 2nd Star Trek pilot.

Codemash 2015 recap

Well I have been home for a few days now after Codemash, and I must say it was a good conference. Because it is platform and technology agnostic, the content tends to be a bit thin in certain areas, such as my area of expertise, iOS development. I went to as many iOS presentations as I could, and then filled in the rest of the schedule with a smattering of soft skills talks and presentations on Microsoft technologies.

For me, the highlights were Ravi Desai’s presentation on Swift, and Chris Risner’s push notification presentation. Both of these had lots of good information that I can use at work and in my own projects that I like to putter around with.

BTW, a posthumous Happy Birthday to Captain Beefheart, an underrated performer by anyone’s measure.

Problems presenting view controller from clickedButtonWithIndex on iPad with iOS 8

As I work through my apps, I keep finding nifty iOS 8 issues. Such as one where I am having problems presenting a view controller from the clickedButtonWithIndex delegate method on an iPad with iOS 8.

From my research, it appears that under the covers, Apple is taking my UIActionSheet and morphing it into a UIActionController on the iPad in iOS 8. Unfortunately, weird things can happen if you try to present another view controller from within the clickedButtonWithIndex method, as the alert controller is still visible when the new controller is being presented. As a result, you get a warning message in the console that looks something like this:

Warning: Attempt to present <NewViewController: 0x12345678> on <OldViewController: 0x98765432> which is already presenting <UIAlertController: 0x24682468>

The solution to this seems to be to react to the didDismissWithButtonIndex method on UIAlertViewDelegate. When this is done, the alert controller appears to be gone on the iOS 8 iPad by the time that the new view controller is presented, and all is happy.

BTW, a posthumous Happy Birthday to Paul Butterfield, a fantastic artist who left us way too early. Luckily he is being immortalized in the Rock and Roll Hall of Fame, so more people should learn about him and experience his music.

CLGeocoder with built-in NSCache

In case you were wondering, Apple “recommends” that you only make one call per minute to their geocoding system. I can kind of understand the reasoning behind this, as they do not want to let people abuse the system. If you have a bunch of geocoding requests that you need to make within a short amount of time, you will not be cut off immediately if you push through a bunch of requests within seconds, but eventually you will get clipped. Now, if the requests you make are part of a table view that is scrolling, wouldn’t it be neat if you could find a CLGeocoder with built-in NSCache?

Well now you can. Please check out my GitHub repository for BPGeocoder:

https://github.com/Wave39/BPGeocoder

This class inherits from CLGeocoder and you use it as a replacement for CLGeocoder, except that it maintains its own NSCache of addresses that it has geocoded, and if you pass in an address it has already seen, it does not bother contacting the Apple servers, it just returns back the cached results it found earlier.

BTW, Happy Birthday to Terry Farrell, who played Valerie in Back To School and Lt. Dax on Star Trek: Deep Space 9, which was the best Star Trek series, IMHO. (Additionally, I think we need to get an internet campaign going to get IMDb to change the cast photo on their DS9 page to be one with Terry. Leave a comment if you agree. Sorry, Nicole!)

EXC_BAD_ACCESS when creating Address Book records on iOS

I have this code in one of my apps that creates some test records in the Contacts app, so that I can quickly build up some address book data for testing purposes. However, I just uncommented out this code for the first time in a long time, and now I am getting some kind of object release EXC_BAD_ACCESS exception when creating Address Book records on newer versions of iOS.

I tracked the problem down to this line:

ABMutableMultiValueRef phoneNumberMultiValue = ABMultiValueCreateMutable(kABPersonPhoneProperty);

While this used to work just fine, I needed to change it to this line:

ABMutableMultiValueRef phoneNumberMultiValue = ABMultiValueCreateMutable(kABMultiStringPropertyType);

And now my address book records are created without any kind of memory crash.

BTW, Happy Anniversary to Godzilla, who premiered in Japanese theaters on this day 60 years ago. Additional BTW, for U.S. readers, don’t forget to get out and vote tomorrow.

Monoprice mechanical keyboard

On a whim, I decided to take the plunge and pick up a Monoprice mechanical keyboard and see what all the fuss was about. Oh sure, I was alive during the clickety-clack days of the IBM PC-XT keyboard, which I am convinced was louder then using a Selectric typewriter.

The keyboard I purchased was a Monoprice MP-G9 mechanical gaming keyboard. This keyboard does not have backlighting, and has the Cherry MX Black switches. I must say I am impressed with the keyboard. It has that old timey feel without being deafeningly loud.

I could have spent a lot more money on a keyboard, but since I was not sure I was going to like this type of keyboard, I tried to spend as little as possible. I would have to say that my next keyboard purchase will be a more expensive model.

The only issue that I had with it was that I wanted to use it with my Mac, and the Windows and Alt keys are backwards from the configuration on my standard Apple keyboard. Luckily, the Keyboard section of System Preferences allows you to alter the modifier keys, so I went and assigned Option to the Command key and vice versa, and now all is happy.

BTW, Happy 45th Birthday to ARPANET, which first went online on this day in 1969.

Software update

(I have been waiting a while to post this picture, it seemed like a good idea to do it today what with the huge flap about the iOS 8.0.1 software update failure…)

I think my computer is trying to tell me that there is a software update…

update_dialog

BTW, Happy Birthday to Justin Bruening, who played Michael Knight on the Knight Rider TV series from 2008.