Monthly Archives: March 2011

Why “shouldAutorotateToInterfaceOrientation” doesn’t Work

The following is from Apple’s Technical Q&A:

  • All child view controllers in your UITabBarController or UINavigationController do not agree on a common orientation set.
  • Overriding the -(id)init: or -(id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle method without calling super. For the object to be initialized properly, you must call super on any init or initWithNibName method you are overriding for your view controllers.

For more detail please see:

Why won’t my UIViewController rotate with the device?

How to make iPhone app icon without borders

Open up the project in Xcode, open the Info.plist file, add a new row and choose “Icon already includes gloss and bevel effects” and checkmark it (set to true).

The original solutions can be found here:

http://forums.macrumors.com/showthread.php?t=747874

Get a list of the languages that iPhone supports

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSArray *languages = [defaults objectForKey:@"AppleLanguages"];
NSLog(@"%@", languages);

NSMutableArray count always returns zero

The code is as follows, rowsToUpdate is NSMutableArray *, [sites count] is greater than 0, and there is value for row index, but [rowsToUpdate count] always returns 0:

	for (int i=0; i<[sites count]; i++) {
		NSLog(@"row index: %i, %@", i, [NSString stringWithFormat:@"%i", i]);
		[rowsToUpdate addObject:[NSString stringWithFormat:@"%i", i]];
		NSLog(@"[rowsToUpdate count] = %i", [rowsToUpdate count]);
	}

There is no obvious problem with the code, and it doesn’t make sense to return 0.

After a couple of search, I found it on stackoverflow.com that I missed the initialization for “rowsToUpdate”. The fix is as follows (a couple lines of code added):

	if (rowsToUpdate == nil) {
		rowsToUpdate = [[NSMutableArray alloc] init];
	}
	else {
		[rowsToUpdate removeAllObjects];
	}

	for (int i=0; i<[sites count]; i++) {
		NSLog(@"row index: %i, %@", i, [NSString stringWithFormat:@"%i", i]);
		[rowsToUpdate addObject:[NSString stringWithFormat:@"%i", i]];
		NSLog(@"[rowsToUpdate count] = %i", [rowsToUpdate count]);
	}

Xcode Warning: “UIKeyboardBoundsUserInfoKey” is deprecated

Simply use “UIKeyboardFrameBeginUserInfoKey” instead:

NSValue *aValue = [info objectForKey:UIKeyboardFrameBeginUserInfoKey];

NSURL Tips

# Loading a string from a website
(this will block until it loads)

    NSURL *url;
    NSData *data;
    NSString *blork;
    url = [NSURL URLWithString: @"https://langui.net/"];
    data = [url resourceDataUsingCache: NO];
    blork = [[NSString alloc] initWithData: data  encoding: NSASCIIStringEncoding];

# Loading an image from a website
(this will block until it loads)

    NSURL *url;
    NSData *data;
    NSImage *blork;
    url = [NSURL URLWithString: @"https://langui.net/wp-content/uploads/2011/03/banner.png"];
    data = [url resourceDataUsingCache: NO];
    blork = [[NSImage alloc] initWithData: data];

# Open an URL in iphone safari

    NSURL *url = [NSURL URLWithString: @"https://langui.net/"];
    [[UIApplication sharedApplication] openURL: url];

More tips available here: http://borkware.com/quickies/

Converting NSString* to NSData* and Vice Versa

NSString* str = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
NSData* data = [str dataUsingEncoding: NSASCIIStringEncoding];

How-To: URL Encode NSString in Objective-C

NSString *url = [@"langui.net" stringByAddingPercentEscapesUsingEncoding: NSASCIIStringEncoding];

Converting unsigned char array to NSString *

The code snippet:

NSString* s = [[NSString alloc] initWithBytes:buffer length:sizeof(buffer) encoding:NSASCIIStringEncoding];

Calling C Functions from Objective-C

As Objective-C is a superset of C, it allows developers to mix pure c source files with Object-C source files.

But to call a C function from Objective-C, you should not import the .c file in your Objective-C .m file, that won’t work.

To call a C function from the Objective-C, you need to create a .h header file to include the C function declaration, and, of cause, include the .h file in the .c source file where the C function resides. Then import the .h file in the .m source file where you would like to call the C function, and simply call the function.