Xcode 4.0 Error: Apple Match-O Linker(Id) Error “…”, referenced from:

April 8, 2011 § 6 Comments

Upgrading to Xcode 4.0 from Xcode 3.0 requires some work. This is a very common error. The fix is simple but it takes a while to identify the source.

Errors:

Apple Match-O Linker(Id) Error “…”, referenced from:

ld: warning: directory ‘/Users/UserName/Development/Project/frameworks’ following -F not found

Fix:

  • Enter FRAMOWORK_SEARCH_PATHS into the search box
  • Remove that directory from the “framework search paths” in the build settings for the project, or for that target

Another Error:

ld: warning: directory not found for option ‘-L/Users/UserName/Desktop/student/../../../../Downloads/ProjectName/ClassName/lib/Debug-iphoneos’

-L is for specifying additional library search path directories. The directory it mentions in the error doesn’t exist.

In the given folder look into the project settings. Update the current directory for the current version of the SDK. Use above fix.

Advertisements

Xcode 4.0 Error: No architectures to compile for – Facebook iOS SDK

April 7, 2011 § 3 Comments

Upgrading Xcode projects from Xcode 3.x to Xcode 4.0 are not that simple. It does involve a lot of “detective” work like solving murder mystery.

In this case it happens on Facebook iOS SDK sample project. The codes work perfectly fine in Xcode 3 yet the same code won’t run in Xcode 4.0 Simulator. After trying many suggestions from Apple Developer Forum, I found the only working solution.

[EROR] No architectures to compile for (ARCHS=i386, VALID_ARCHS=armv6).

“No architectures to compile for” means “Valid Architectures” field is empty. Update it to $(ARCHS_STANDARD_32_BIT) and you’ll see the usual armv6 armv7. This happens in XCode 4 after updating “Base SDK” to “Latest SDK”.

Instruction:

  • Select Project in the Navigator left panel in Xcode 4
  • Select Targets
  • In Build Settings, enter VALID_ARCHS in the search box to show Valid Architectures
  • Enter $(ARCHS_STANDARD_32_BIT) in the value column
  • It should show armv6 armv7
  • Run

Disable & Enable Idle Timer in iOS SDK

March 2, 2011 § 2 Comments

By default, the idle timer will dim the screen after a period of non use and then turn the power to the screen off. You may need to disable idle timer on a specific app such as a Flash light app or location-based app.

– (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

}

Add the following line:
[application setIdleTimerDisabled:YES];

– (void)applicationWillTerminate:(UIApplication *)application {

}

Add the following line to re-enable the idle timer:
[application setIdleTimerDisabled:NO];

This won’t work on the Simulator but it definitely works on device.

Debugging using printf() in Xcode Console

March 2, 2011 § 2 Comments

You can use printf() function inside .m file to indicate the app status such as application starts and ends.

In Xcode, select AppDelegate.m file, insert a line inside applicationDidFinishLaunching: method:

– (void)applicationDidFinishLaunching:(UIApplication *)application {

}

Add the following:
printf(“%s\n”, __FUNCTION__);

Note: The __Function__ has two underscores before and after the FUNCTION.

Add the same line to applicationWillTerminate: method

– (void)applicationWillTerminate:(UIApplication *)application {

}

You should be able to see the printed output inside Xcode Console when you launch the app

[AppDelegate applicationDidFinishLaunching:]

After you exit the app by pressing the Home button on the iPhone simulator, you will see this printed output
[AppDelegate applicationWillTerminate:]

UIDevice Properties

March 2, 2011 § Leave a comment

Currently these are the most popular common UIDevice properties. It shows the device name, device identifier, device model, device system name, and device system version.

You can print these properties inside the Console for debugging.

NSLog(@”Device Name: %@”, [UIDevice currentDevice].name);
NSLog(@”UDID: %@”, [UIDevice currentDevice].uniqueIdentifier);
NSLog(@”Device Model: %@”, [UIDevice currentDevice].model);
NSLog(@”System Name: %@”, [UIDevice currentDevice].systemName);
NSLog(@”System Version: %@”, [UIDevice currentDevice].systemVersion);
NSLog(@”User Interface: %@”, [UIDevice currentDevice].userInterfaceIdiom);

If you would like to print it in a label, then you can assign an NSInteger object to the UIDevice property. Assign the UILabel text to the NSString object.

// Show Device Name
NSString *nameString = [UIDevice currentDevice].name;
nameLabel.text = nameString;

You can also print Core Foundation object in Console.

CFShow([[UIDevice currentDevice] model]);
printf(“–\n”);

UITableView Hello World

May 24, 2010 § 1 Comment

Usually writing a tutorial blog takes a lot of time and effort to document every step and explain all details. I have seen many HelloWorld app that show very little on how iPhone app and SDK work. I include the best HelloWorld tutorial and example I found.

These are the most important building blocks of iPhone App. However usually developers don’t start with new app and may be working on existing app. Sometimes developers never get to build new View Controller and/or view. You won’t remember all the details in each step. It’s nice to reference this kind of Hello World example.

It’s nice to see how a navigation-based app with minimal functionality and show how the navigation bar and button work.

UITableView Hello World

http://icodeblog.com/2008/07/26/iphone-programming-tutorial-hello-world/

Add View Controller and View and Back Button to HelloWorld

http://icodeblog.com/2008/08/03/iphone-programming-tutorial-transitioning-between-views/

Note: Remember setText is deprecated in OS 3.2 and warning will appear in this Hello World example.

Populating UITableView with NSArray

http://icodeblog.com/2008/08/08/iphone-programming-tutorial-populating-uitableview-with-an-nsarray/

I am including code snippet to show how to gain access to UIApplication delegate to return the NSArray object in UITable row.

In RootViewController.m

// Customize the number of rows in the table view.
– (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

// Gain access to Application delegate
HelloNavigationAppDelegate *appDelegate = (HelloNavigationAppDelegate *)[[UIApplication sharedApplication] delegate];
// Return no of rows based on no. of objects in array
return appDelegate.fruits.count;

}

// Customize the appearance of table view cells.
– (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @”Cell”;

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
}

// Gain access to Application delegate
HelloNavigationAppDelegate *appDelegate = (HelloNavigationAppDelegate *)[[UIApplication sharedApplication] delegate];
Fruit *f = (Fruit *)[appDelegate.fruits objectAtIndex:indexPath.row];
cell.textLabel.text = f.name;

// Configure the cell.
return cell;
}

I have rewritten the UITableView Hello World sample in iPhone SDK 3.2 and replaced the deprecated API that no longer support UITableView. You can download the latest version here

UITableView deprecated setText in iPhone SDK 3.0

May 24, 2010 § Leave a comment

By default Navigation-based app use UITableView.

In RootViewController.m, you would declare the no. of row in tableView: method. Here you increase the row from 0 to 1 to display one row.

// Customize the number of rows in the table view.
– (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 1; // Modify from 0 to 1
}

cell.text and setText: are deprecated in iPhone SDK 3.2. It would give you warning but error in red.

So don’t use:

[cell setText:@”Next View”];

cell.text = @”Next View”;

Use cell.textLabel.text = @”Next View”;

// Customize the appearance of table view cells.
– (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @”Cell”;

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}

// Added
cell.textLabel.text = @”Next View”;

// Configure the cell.
return cell;
}

Where Am I?

You are currently browsing the Xcode category at Web Builders.