how to link view controller and .xib file to tab bar item in xcode 4 - iphone

I have a tab bar with 4 items and i want to link the .xib files to each item. The problem is that the NIB File Name shows no items, and if i write the .xib for example, StartView without the .xib i get an error. I get the same error when i link the tab item to the view controller class in the Identity Inspector. This is the error:
'NSInternalInconsistencyException', reason: '-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "StartView" nib but the view outlet was not set.'
I had no problem with this in Xcode 3. As far as i know i don't need outlets in my view controller to be able to link a view to a bar item.
Any ideas on how to fix this?
Thanks.

Each .xib has a main view that must be connected to its files owner. Usually when you change the class name of a .xibs owner, the view outlet will become disconnected. So you'll want to first check that the class name of your .xib is the custom controller you have made. You then have to open the .xib and click on the connections inspector. Then just drag and connect the view outlet (labelled as view in the connections inspector) to your view.
Cheers.

Problem solved, but i didn't like the solution. I created the view controller again and selected to create a .xib file along with the controller and that was it. Then i made the usual references from interface builder and it's working. I didn't like it because the .xib file has the same name as the view controller class. If anyone knows how to create the .xib file and the view controllers separately and get it to work, please inform me, i would really appreciate it.

select create new file, objective c, check the make xib file box and in the name of it, add .xib extension to the end of the name

Related

View controller suddenly wont connect to .h file

I created a new View Controller, I then opened up and created a new filed (Objective-C class) and then created a subclass of UIVewcontroller. I added my table views and labels in story board and now suddenly it wont connect them to the .h subclass Ive created. Any suggestions?
You have to name that the view controller is part of your class. Select your view controller and on the third tab on the right write the name of your view controller. Here is a picture I got from this tutorial to help:

File's Owner is not showing Tab bar controller Outlet?

I have included Tab Bar Controller in my application.
I have declared Outlet in the App Delegates' .h and .m file.
When I am right clicking on File's Owner, It doesn't show me Outlet.
OR
If I double click on the Tab Bar Controller I could not see the Outlet.
How to connect it...
I have Included the XIB file in an empty app.
I am using Xcode 4.
Any body can tell me how to get APPLICATION DELEGATE icon when clicking on xib file...??
Click on the app delegate icon and not on the file's owner.
Did you set the class for that xib or not. you can check that in the custom class group like in this pic. If not than you should set it with a class name of your choice.
Arpit, Instead of declaring Outlet in ProjectNameAppDelegate.h file that is being shown in side list... declare in .h file with the same name as .xib file... Same problem has been faced my me also... Hope this will help you...
You need to get the the type "'Object'" and drag it to the Below the File's Owner Window.
Set it's Class to your present appln delegate..this is the way you can create app delegate if not present by default near file's owner.

App crashes when tab bar item is selected

I have a tab bar item with a UIScrollView and all the code works.
I link the UIScrollView IBOutlet in IB to a UIScrollView I placed in my View.
When I run the app and select the tab bar item I get the following error.
Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key scrollView.'
I have no idea what this is. When I disconnect the ScrollView IBOutlet, then there is no crash.
Thanks
You probably renamed the name of the scrollView in the code without re-connecting the outlet in Interface Builder. Double check your code to make sure the spelling is the same as in Interface Builder, and for good measure, reconnect the outlet to scrollView.
Referring to this Apple forum thread, UITabBarController has multiple UIViewControllers each of which has its own nib file assigned to it. It's up to you to make sure you change the UIViewController's class file: in the nib file for each view controller and in the tab bar controller's nib file, you also have to do the same thing by changing each view controller's nib file and class.
So all in all you have to update settings in two places: the individual nib files for the view controllers and the tab bar controller's nib file. Think of it as creating the connections/bridges between the individual nib files and the tab bar controller.
Once these connections are made, your program should have no problem accessing your scrollView outlet, since that is how it ultimately accesses it: by using key-value coding by means of your tab bar controller (at least, that's my understanding). As of now it can't because the tab bar controller is not connected properly.

getting error like ur view controller and nib file

i have observed 1 warning when i am opening my nib file ,but that doesnt effected my out put ..
i want to to know what causes this error
its showing ' View Controller' has both its 'View' and 'NIB Name' properties set. This configuration is not supported.
This can happen if your viewcontroller object on your MainWindow.xib has child views, mainly a UIView, in that xib AND has the "NIB Name" property set to some existing XIB.
you can either move the child views from the viewcontroller object in the MainWindow.xib to the viewcontrollers actual xib file via copy and paste.
or you can clear out that NIB Name variable found on the first inspector pane of the viewcontroler object in the MainWindow.xib

Creating a nib file for a Table View Controller

I was trying to follow the Table View Programming Guide for iPhone OS but was having trouble creating a new Table View Controller that loads its data from a nib file.
Specifically, I was trying to follow the steps in this part:
If you prefer to load the table view
managed by a custom table-view
controller from a nib file, you must
do the following:
In Interface Builder, create an empty Cocoa Touch nib file (File >
New).
Drag a UITableViewController object from the Interface Builder
Library into the nib document window.
Save the nib file in your project directory under an appropriate name
and, when prompted, select your
project to have the nib file added to
it.
Select Table View Controller in the nib document window and open the
Identity pane of the inspector. Set
the class to your custom table-view
controller class.
Select File’s Owner in the nib document window and set its class
identity to the custom table-view
controller class.
Customize the table view in Interface Builder.
Select the table-view controller in the nib document window, open the
Attributes pane of the inspector, and
enter (or select) the name of the nib
file in the Nib Name field.
So I created a new UITableViewController subclass in Xcode (called "MyTableViewController"), then I went into IB and followed those steps. I made sure to link up all the Class attributes to the same name as the UITableViewController subclass I made in Xcode like it says in the steps.
But now I get the following warning in IB:
"My Table View Controller" has both its
"View" and "Nib Name" properties set.
This configuration is not supported.
When I run the application and push the table view controller, it appears but it seems like nothing is being loaded from the nib file at all (e.g. I set the alpha to 0 instead of 1).
Any idea as to what I'm doing wrong?
Thanks for the help.
Here's some more information that might help you understand the situation better.
I noticed a few differences between creating a UITableViewController with the template (e.g. by creating a new Navigation-based Application) vs. creating one yourself (e.g. following the steps above). I'm going to refer to each as TemplateNib and CustomNib, respectively, to make it easier to understand the differences.
In TemplateNib, it has the following objects in the document window:
File's Owner
First Responder
Table View
In CustomNib, it has the following objects in the document window:
File's Owner
First Responder
My Custom Table View Controller
Table View
Another difference is in the File's Owner links...
TemplateNib's File's Owner:
Outlets
tableView -> Table View
view -> Table View
Referencing Outlets
dataSource -> Table View
delegate -> Table View
CustomNib File's Owner:
Outlets
view -> (nothing)
CustomNib My Table View Controller:
Outlets
view -> Table View (this is grayed out so you can't delete it)
Referencing Outlets
dataSource -> Table View
delegate -> Table View
Update:
I tried to mimic the .xib file that is created by the template by following these steps:
Created an empty file in Interface Builder.
Set the File's Owner to the class that inherits from UITableViewController.
Added a Table View to the document window.
Set the Table View's dataSource and delegate to File's Owner.
Set the File's Owner view to the Table View.
Added a tableView propery in the Identity pane of type UITableView.
Set the File's Owner tableView property (which I just created) to the Table View.
However, this still seems like it is not loading it from the NIB file. (I also never set the name of the NIB file anywhere though... is there anyplace I need to set it or does it look for one with the same name?).
I then tried overriding initWithNibName to load from the name of the nib file, and now it does seem to load it from the nib file. However, if I look at the .m file of the TemplateNib table view controller, it doesn't need to override this method, why is that? I still think I am doing it the wrong way cause the Programming Guide didn't mention anything about doing it this way.
Update:
I tried comparing the two .xib files using a diff tool, the only significant difference between the two seems to be:
<string key="superclassName">UITableViewController</string>
// and:
<reference key="NSSuperview"/>
I don't see any reference to the Nib file in the original file anywhere, are there any other files I should check?
Update:
It seems like the thing that makes TemplateNib load from the nib file is that in the MainWindow.xib (default name given by the template), the RootViewController is added with the NIB Name property having the value "RootViewController". Additionally, its class is set to "RootViewController".
I tried putting a breakpoint in both initWithNibName:bundle: and initWithStyle: on the RootViewController, however, it never gets to there. I'm kinda wondering how the TableViewController is created when you set it up in the MainWindow.xib like that.
I also tried adding the my custom table view controller to MainWindow.xib, setting the class and nib names in hopes that it will load it from the nib file I specified, but it doesn't even call iniWithNibName.
Create a TableViewController in Xcode.
Create an empty nib file in Interface Builder.
Set the File's Owner Class property to the TableViewController from step 1.
Add a TableView to the empty nib file.
Set the File's Owner view property to the TableView from step 4.
Customize the TableView in IB as you want.
Override the initWithNibName:bundle: method in Xcode for the TableViewController you created and use code similar to the following:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if (self = [super initWithNibName:#"MyNibName" bundle:nibBundleOrNil]) {
// Custom initialization
}
return self;
}
I had this same problem last night and found this post while trying to search for the answer. I ended up solving it.
Basically I had opened up the wrong XIB file (I hoped main_window.xib, not the view controllers xib)
I cut all the controls from my main xib, pasted them into the controllers xib, realigned everything, reconnected all the outlets/actions and the warning went away :)
Hope this helps someone :)
Instead of doing all that, I would use the "New File" iPhone UI template to create a TableViewController with xib file option checked. Then you get a controller and xib file all wired together properly.
Eagle, when you create a new file, select the "UIViewController subclass" icon. There's a checkbox to make it a UITableViewController subclass just above the checkbox to include XIB file.
You've got two places where your UITableViewController shows up in Interface Builder.
(1) It shows up in the nib with the controllers own name.
(2) It shows up as a controller object in the nib of another object, usually the MainWindow.
Your problem is at (2). There are two ways to set the tableview for a UITableViewController in Interface builder. First, you can create a UITableView under the controller in the MainWindow and connect that to the controller's view property. Secondly, you can bring up the inspector in the attributes pane and in the popmenu listed "NibName" select the name of the controllers nib.
You can't use both systems at once because the first loads a view from the MainWindow nib file and second loads a completely unrelated view from the controller's separate nib file.
This is one of those maddening errors that using Interface Builder makes so hard to track down.