Sunday, November 28, 2010

Fonts in iPhone 4.2.1

I've always been intertested in "fonts", so one of the first things to do after installing iPhone 4.2.1 was to checked available fonts. Don't know about others, but I'm pretty sure Apple Color Emoji wasn't in previous iOS version! Now I'm wondering about the others...

Thursday, November 25, 2010

Accessing Unknown 'cornerRadius' Component of a Property

Wanted to create rounded corners for a component, done this before in another project. Suddenly it doesn't work any more:
button.layer.cornerRadius = 8.0f;
Forgot to include header:
#import <QuartzCore/QuartzCore.h>
Error code kind of hinted in that direction, I guess... Wasn't very obvious. Btw check that CoreGraphics.framework is already included in project.

Tuesday, November 23, 2010

UIActionSheet Last Button Not Responding

Your UIActionSheet's bottom button, most likely Cancel, is not responsing to tap.

Check whether there is a UITabBar or UIToolbar below it. The problem is that most likely you try to show actionSheet as subview of your current view, which starts only above tabs and toolbar. However since actionSheet is always shown attached to bottom of the screen, you will miss taps outside your view.

Xcode 3.2.5 Base SDK Missing

Downloaded Xcode 3.2.5 and iOS SDK 4.2, installed and opened an old project. Got error note Base SDK Missing, as expected. Nothing to worry about!

Select project, press Command-i to view project info, find Build - Architectures - Base SDK and select the new "Latest iOS (currently set to iOS 4.2)". Close info - and nothing happens!

Select Targets and your application, press Command-i to view target info. You might have overwritten default project settings by mistake earlier. Check what is Build - Architectures - Base SDK. Should be same as you just defined for project. Close info - and nothing happens!

Close Xcode, reopen your project - and Base SDK is set! Didn't really expect this kind of new features with the update...

Update: No need to close Xcode, just toggle some settings via "Overview" popup at top left corner. For example change "Active Configuration" to Release and back to Debug. Usually that's enough, though sometimes target device has changed, too. Verify all "Overview" selections after you've done this.

Sunday, November 21, 2010

How to Disable Copy, Paste and Select for UITextView

Need to use UITextView, but don't want Copy, Paste and Select feature. How to disable that? Tried overwriting canPerformAction:withSender but I got still a flash of quickly disappearing popup menu and selection.

Subclass UITextView and overwrite canBeforeFirstResponder to return always NO:
@interface MyUITextView : UITextView
@end
@implementation MyUITextView
- (BOOL)canBecomeFirstResponder
{
   return NO;
}
@end
Now you have completely hidden and disabled copy, paste and select for UITextView!

Friday, November 19, 2010

Why Doesn't Repeating NSTimer Invalidate

Most likely your timer is started more than once. If you can't find why that happens (or is done by iOS for unknown reasons), easy and safe fix is to invalidate your timer just before you create it:
[self.myTimer invalidate];
self.myTimer = nil;
self.myTimer = [NSTimer scheduledTimerWithTimeInterval:1
    target:self
    selector:@selector(updateTime)
    userInfo:nil
    repeats:YES];
You can call [nil method] without problems in iOS.

Tuesday, November 16, 2010

Code Sign error: Provisioning profile can't be found

Check what is Info.plist Bundle Identifier, go to Apple iOS provision portal and download related App ID provision file and install. Note that if you're not Team Admin, you have to ask someone else to download the file for you.

Actual error code shows also cryptic mobileprovision id, but that won't help you much:
Code Sign error: Provisioning profile '123456F8-1234-1234-ABCD-ABCDEFGH1234' can't be found

The executable was signed with invalid entitlements (install)

This is not the error with EXACTLY same error note you get during ad hoc release creation in Xcode (see here). This one comes, when you try to install that "successfully" created ad hoc release into device.

OPEN, no idea what went wrong or how to fix. Yet.

Code Sign error: The identity 'iPhone Developer' doesn't match any identity in any profile

Your developer certificate is missing, download and install from apple dev website:
  • Revoke, request new, remove old stuff from Keychain Access, install new
  • Create new Development Provisioning profile with new cert, download and install

Team Provisioning Profile - Invalid. Renew button disabled

Team Provisioning Profile - Invalid. Renew button disabled.

Open Xcode Organizer, find Team profile and press Renew button. Automatically downloads Team Provisioning Profile, but only for apps with * App ID.

Monday, November 15, 2010

Everything That Can Go Wrong With Xcode Build and Release

Right now I'm in the middle of serious mess up of my Xcode development environment, can't create ad hoc builds. No idea what triggered it, thus no idea what or how to fix. Since same error notes keep popping up time after time, I start documenting each. Maybe I'll slowly gather enough info to fix something.

Xcode error notes:
Useful articles:
Useful sites:
Have patience, try again, just keep bumbing your head into wall, no pain no gain, good luck, it works for me, wave the rubber chicken above monitor... yep, I know: none of it helps.

You have sympathy. It won't help either.

Build & Archive - Share Application - CSSMERR_TP_NOT_TRUSTED

Build & Archive - Share Application and both Email and Save fail without any visible error note. You seem to have been simply ignored. Try again to be totally ignored.

Possible error notes you can find from Console application - Databases searches - Console Messages:
  •     Command /usr/bin/codesign failed with exit code 1
  •     CSSMERR_TP_NOT_TRUSTED
Open Keychain Access, go to "login" keychain "Certificates" catogory. Open each development related certificate (Apple WorldWide Developer Relations Certification Authority, iPhone Developer, iPhone Distribution) and make sure their Trust details are "Use System Defaults"

Command /usr/bin/codesign failed with exit code 1

Select your project root in Xcode, command-i for Info, go to Configurations tab, delete old "Ad Hoc" configuration, duplicate Release and rename as "Ad Hoc". Rebuild and i installs and runs on connected device.

Problem might have been due space in name (even when it used to work earlier).

The executable was signed with invalid entitlements

Try to create ad hoc release in Xcode, got error note:
The executable was signed with invalid entitlements.

The entitlements specified in your application's Code Signing Entitlements file do not matchc those specified in your provisioning profile (0xE8008016). [OK]
Case 1: Go to Provisioning Portal - Provisioning - Distribution, find your project Distribution Provisioning Profile, Edit - Modify (do whatever and revert if everything already is right) - Submit - Download and double-click the file at your dev machine. Clean and rebuild.

Case 2: make sure you have Entitlements.plist file in your project, containing just one prorerty called get-task-allow". This has to be off. Add name of this file into your project ad hoc release Code Signing Entitlements.

Thursday, November 11, 2010

How to Undo Past Last Point

This is one of those things you do only once, thus easily forgotten. Did it for "my" machine, but now I'm a contractor using customer machine.

So how do I get rid of this annoying warning note, when I want to undo after saving a file:
You are about to undo past the last point this file was saved. Do you want to do this?
Open Terminal window and type:
defaults write com.apple.Xcode XCShowUndoPastSaveWarning NO
Restart Xcode and you're fine. Until next machine.

How to Center UIImage On-Screen

Created dynamically an UIImageView with small UIImage at top left corner. Wanted it centered, but UIImage automagically resized UIImageView, which was by default stuck at that forementioned top left corner.
UIImage *image = [UIImage imageNamed:@"small.png"];
self.imageView = [[UIImageView alloc] initWithImage:image];
There are several ways to fix this, some more complicated while some more difficult. Common thing is that they contain a lot of code to infest with bugs. However simple problems require simple solutions:
self.imageView.center = self.view.center;
[self.view addSubview:self.imageView];
I'm too embarrassed to tell how much time I "invested" until I got to this solution. Let's just say that I learned a lot. Btw this code does not rotate. There are several ways to fix this...

How to Define UITableViewCell reuseIdentifier for loadNibNamed

When you create UITableViewCells, it's important to use reuseIdentified. This lets iOS recycle your table cells, thus improving performance and minimizing memory use. Using it is pretty simple:

static NSString *idCell = @"MyCellId";
cell = (UITableViewCell *)[aTableView dequeueReusableCellWithIdentifier:idCell];
Try to reuse an already existing, but not currently used, cell created earlier with given identifier "MyCellId". If such isn't found, create a new one:
if (cell == nil)
{
    static NSString *nibcell = @"MyCell";
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:nibCell owner:self options:nil];
    cell = (UITableViewCell *)[nib objectAtIndex:0];
}
This code requires a separate stand-alone XIB, which contains nothing but your UITableViewCell. But how do you define the reuseIdenfier? That property is read-only and created when table cell is created.
reuseIdentifier
A string used to identify a cell that is reusable. (read-only)
@property(nonatomic, readonly, copy) NSString *reuseIdentifier
Open your XIB in Interface Builder, select UITableViewCell object, open "Table View Cell Attributes" (press command-1) and write your hardcoded magical string "MyCellId" into "Identifier" field. Use the same string in your code as reuseIdentifier.

Warning: you should NEVER access objects inside XIB (NIB) by magical index into array! Apple might change "something" in next Xcode release and thus break your code. You should use IBOutlets. You have been warned.

...yes, this is one of those sad "don't do as I do, but as I tell you to" cases...