I have created a blank project using the single view option on Xcode templates.
WHen this project loads, the rootViewController class is loaded, but I don't see on the app's delegate any line loading the rootViewController.
As I generally don't use interface builder and I create my controllers programmatically I ask: where is the rootViewController loaded and how do I change the app to load another viewController instead?
thanks.
Probably in your MainWindow.xib, you define the first controller that you want to load, in your case it is rootViewController.
didFinishLaunchingWithOptions:. This method is always known to be the first to be called when launching an application. Try to check here. The Main NIB File is set in Info.plist ( located in the target settings) so that you will already have a NIB loaded when your application delegate is invoked.
It's loaded from the main interface builder file.
See your projects settings on what interface builder file is loaded, and then check what root controller it will load.
iOS loads your app -> then the Interface Builder (NIB) file specified in the settings for that app -> The nib loads a bunch of views/viewcontrollers etc
I hope you find it!
Related
I'm new to macOS programming and recently I started working on this project. Because I needed to share my ViewController and view with my Safari extension target, I ended up setting the view controller manually in AppDelegate:
let application = NSApplication.shared()
let initVC = ViewController.viewControllerWithNib()
let window = application.windows.first!
window.windowController?.contentViewController = initVC
window.contentViewController = initVC
window.makeKeyAndOrderFront(nil)
I just left Main.storyboard to include the application portion since I couldn't figure out how to remove the storyboard and just use a xib as a startup for my application. Curently, I'm getting the following warning:
Window Controller requires a content view controller, main.storyboard
I'm trying to figure out why the app is giving that warning and what's the way to get rid of it.
You should see the info.plist, I remember there is a need to delete the name NSMainxxxx.
As Diven mentioned, there's also an entry in plist file, UIMainStoryboardFile which tells which storyboard needs to be used. The equivalent of it for nibs is NSMainNibFile. But in addition to that, there were several other steps that I needed to do for replacing the storyboard fully with a nib which are mentioned in this post. Generally, what you need is following steps:
Add a new nib to your project and choose a name, e.i. MainNib. You can choose an Application nib template
Go to project, under target -> General -> Deployment Info -> choose the nib you created as Main interface
Go to your nib, as mentioned in here, add a blue object and assign its class to AppDelegate and then ctrl+drag/drop from File owner to that object and choose that one to be the delegate.
I updated the project with these changes.
There's no more Info.plist you can easily select the target and check the Info tab. And there's Main nib file base name there.
I have been working on IOS application. Before I had single project in which all source code was there application loaded properly in that setup, now I had split that into multiple projects. After that I am facing now a problem... in ViewDidLoad, IBOutlet for buttons all are coming nil values, view also loading black colored. I am not able to guess what was the problem. Any idea about what could cause this...
I have loaded my view like this...
main =[[main_page_controller alloc] init];
if (main != NULL)
[root.navigationController pushViewController:main animated:YES];
I am not sure which part of the code do I need to post here, to make the question more understandable... Please share your suggestions..
Edit: I ran my old project and then tried with my new set up application launching successfully. I removed the application from device, and loaded using new set up only, problem again shows up. So what was there in old set up? What am I missing in new... ????
Refer to the documentation
To initialize your view controller object using a nib, you use the initWithNibName:bundle: method to specify the nib file used by the view controller. Then, when the view controller needs to load its views, it automatically creates and configures the views using the information stored in the nib file.
When initialising a view controller, and you're using a .xib file for the view, you need to call initWithNibName:bundle:. This means it'll use the xib file to create the view within loadView. At the moment, you're just using init, that will create a blank UIViewController object.
So in this case, your code would be (assuming the .xib is called "MainViewControllerView.xib" within the main bundle):
main =[[main_page_controller alloc] initWithNibName:#"MainViewControllerView" bundle:nil];
if (main) {
[root.navigationController pushViewController:main animated:YES];
}
Also sanity check your .xib file to see if all the IBOutlets are connected to what you want.
First check all your connection in xib(nib) file, if its already connected then just disconnect them , clean project (cmd+k) and then connect connection again.
take a look on this image for connection
I have created a class 'abc' which a subclass of UIViewController. At the time of creating it i clicked the option for creating an xib for it automaticaly. Now the xcode creates 3 files for me
1. abc.h
2. abc.m
3. abc.xib.
Now whenever i create an object of abc class like
abc *a=[abc alloc];
Even when i am not initialising the object with initiwithNibName and using it, it is loading the xib file. So how this xib file got associated with the abc object. And even if i deleted the abc.xib, then also it loads that xib file. I couldnt understand from where it is loading the xib file, if it it not present in the project space. And where the association of xib and controller is stored?
Thanks in advance.
What's going on is that the default implementation of initWithNibName:bundle: searches the Main Bundle for a Nib file that has the same name as your View Controller class. This happens whether you select the option for creating the Nib automatically or not. See UIViewController documentation (the discussion portion of initWithNibName:bundle:).
Now the initWithNibName:bundle: method is UIViewController's default initializer, which means that even if you don't use it directly (say that you use init instead) it will get called under the hood anyway.
Finally, even if you delete the Nib file from XCode, for some reason (not sure why) it doesn't get deleted from the Main Bundle (at least in the simulator). Even if you clean & build the project it stays there. The solution I use to get completely rid of the Nib file is to delete the App from the simulator, then clean & build again.
Hope this helps!
The xib is probably still in your compiled area, so you need to perform a clean to get rid of it fully. (Product >> Clean). The default init method of UIViewControllers will automatically look for a xib of the same name, which is why it's still allocating that xib. Once you clean it will stop.
Reference:
http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/initWithNibName:bundle:
Note this part: If you specify nil for the nibName parameter, you must either override the loadView method and create your views there or you must provide a nib file in your bundle whose name (without the .nib extension) matches the name of your view controller class. (In this latter case, the class name becomes the name stored in the nibName property.) If you do none of these, the view controller will be unable to load its view.
I have downloaded an Xcode project that has three xibs (A.xib, B.xib, and C.xib). I noticed that:
None of them is called "MainWindow.xib".
In the project summary the Main Interface value is set to MainWindow
Main nib file base name is not set
Main.c does not specify the app delegate either int retVal = UIApplicationMain(argc, argv, nil, nil);
Still, when I build&run, the app loads A.xib.
How does the app decide what to load?
I am using Xcode 4 and I am targeting iOS 5.
Thank you.
You can set the Main Interface in the Summary tab of your app target.
See this image:
EDIT: Or, as Alan wrote, you can set it in your info.plist file.
EDIT 2: Oh. I see what your problem is. You can use MainWindow as your main .xib file, but you have to edit which .xib is loaded in MainWindow. Open MainWindow.xib, and select the view controller that is used. If I'm right, its class is set to A. If you want B.xib to be used, you have to change the class to B. You will also have to set the NIB being used for the view controller, in the Attribute Inspector.
Set the class for the UIViewController being used in MainWindow.xib:
Set the NIB:
In your application's Info.plist.
This is not the same situation as the multitude of other similar questions here.
* Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UIViewController _loadViewFromNibNamed:bundle:] loaded the GameView nib but the view outlet was not set.'
You might be thinking "do as it says, connect the File's Owner to the View in IB!". But the thing is, I don't even HAVE a GameView.xib in my project or even in the project directory.
I do have a "GameViewController.m" and matching "GameViewController.xib" in my project. Using that GameViewController is what brings up this error, but I don't understand where it gets the idea to try and load "GameView.xib". Shouldn't it use "GameViewController.xib" instead?
If I grep my project directory, I do see it referenced from "UserInterfaceState.xcuserstate".
<string>file://localhost/Users/bemmu/Dropbox/b2/iphone/ValleyStory/ValleyStory/GameView.xib</string>
This mentioned file does not exist. I might have had a file with that name before and renamed/deleted it, but it's not being referenced to from anywhere that I can see in IB.
Did I manage to confuse xcode?
My solution was a little different.
Click on the xib in interface builder
Select File's Owner on the left
Open the File's Owner's connections inspector
If the view property isn't yet wired, control-drag it to the view icon (under the file's owner and first responder icons).
Check any nib files you're using (like MainWindow.xib). If you are loading GameViewController from a nib, check the file it's loading from (under the info tab in the inspector). Make sure it's set to "GameViewController" and not "GameView".
I had this issue as well, but had to solve it a different way. Basically, I have a view controller name MainViewController, which has a xib named MainViewController.xib. This nib has it's view property set to the File Owner which was MainViewController.
I also made a MainView.xib that contained a view that was going to be programmatically added to the view defined in MainViewController.xib and it's view. It basically encapsulated an internal view that would be in the MainViewController.xib's view, and also had it's File Owner set to MainViewController.
So basically, I wanted MainViewController.xib to load as the nib for the MainViewController object, and inside MainViewController, at some later point, I would add the internal view specified by MainView.xib.
A couple issues arose:
1.) I found in the Apple docs that when loading a view controller via storyboard or nib:
"If the view controller class name ends with the word “Controller”, as
in MyViewController, it looks for a nib file whose name matches the
class name without the word “Controller”, as in MyView.nib.
It looks for a nib file whose name matches the name of the view
controller class. For example, if the class name is MyViewController,
it looks for a MyViewController.nib file."
Therefore, you cannot have a nib called MainView.xib if you also have a nib called MainViewController and want MainViewController.xib to be the primary nib for MainViewController.
2.) Even if you delete MainView.xib or rename it to something else (MainInternalView.xib in this case), you MUST delete / clean your iOS simulator as the old nib file (MainView.xib) will still remain in the application. It doesn't overwrite the whole application package when you rebuild / rerun your application.
If you don't want to reset your content settings (perhaps you have some data you want to preserve), then right-click on your application in your iOS Simulator folder, Show Package Contents, find MainView.nib, and delete it. Xcode will NOT do this automatically for you when you rebuild, so we need to manually remove the old nib.
Overall, don't make nibs named MainViewController and MainView, i.e. nibs with the same prefix. Call MainView.xib something else, like MainInternalView.xib.
I recently solved this issue. Make sure you back up your project before following the steps given here (just in case). These steps solved my issue
Quit Xcode
Navigate to UserInterfaceState.xcuserstate located at .xcodeproj/project.xcworkspace/xcuserdata/<username>.xcuserdata and delete the file.
Reopen Xcode. Xcode will create a new UserInterfaceState.xcuserstate which will be clean.
In my case this error was produced by dumb mistake - I delete _view view
In my case, I was not using a xib at all. I needed remove the .m file from Build Phases > Compile Sources and added it back.
Given you referenced it previously it sounds like xcode hasn't ackowledged it no longer exists. From the Product menu select "Clean" and then "Build" hopefully this will get past the old reference for you.
Face the same Problem, had to change the view's name in code:
MyViewController *controller = [[MyViewController alloc] initWithNibName:#"WrongViewName" bundle:nil];
To
MyViewController *controller = [[MyViewController alloc] initWithNibName:#"RightViewName" bundle:nil];
I had multiple views, and by accident (I don't know how this happenned) but my background view didn't have a file owner, so for anyone else who has this problem in the future, make sure all your views have a file owner.
I was gettint the same error then check the classname from interface builder and see that I typed the view controller class name at the custom class attribute.
UIViewController searches for a nib with the same name as the controller when passed nil to initWithNibNamed:bundle: Check that the file name that you pass to the initializer is correct and exists!
For example:(e.g. [[CCVisitorsController alloc] initWithNibName:nil bundle:nil] then UIViewController tries to load nib with name CCVisitorsController as default.
If that file does not exist then the error you mentioned is thrown.
I had this problem because I was doing something bad in
(id) initWithCoder:(NSCoder *) coder
which the NIB loads.