SplitViewController only displays white screen - ios

I have had a published universal app for many years that has worked fine. Now since the iOS13 update it simply starts to a solid white screen. The only exception is if I run it on an iPad and change orientation of the device. Than the app finally appears as it always has. I have placed a breakpoint in my delegate file in the Application method and another in my rootviewcontroller in the viewDidLoad method. In iOS 12 both breakpoints get hit and everything runs as it always has. In iOS 13 the rootviewcontroller breakpoint never gets reached. The app is very old and uses plain old XIB files with no Storyboards.
The code in my delegate is this;
#import "AppDelegate.h"
#import "RootViewController.h"
#implementation AppDelegate
#synthesize window, splitViewController;
#synthesize managedObjectContext = _managedObjectContext;
#synthesize managedObjectModel = _managedObjectModel;
#synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[self.window setRootViewController:self.splitViewController];
[self.window makeKeyAndVisible];
return YES;
}

Issue with iOS 13 Split view controller. If you have navigation controller embedded to Master/Detail view controller it just loads the navigation controller.
To fix that issue create a custom class from UISplitViewController and assign that to your splitviewcontroller in storyboard and programatically add Navigation controller and masterViewcontroller to that UISplitViewController. That should load your view properly. This code goes in the viewdidload or willappear of the UISplitviewcontroller class.
Sample code.
MasterViewController *master = [[MasterViewController alloc] init];
UINavigationController *tableViewNavigationController = [[UINavigationController alloc] initWithRootViewController:master];
UINavigationController *navC = [[UINavigationController alloc] init];
self.viewControllers = [NSArray arrayWithObjects:tableViewNavigationController,navC, nil];
This fixed my issue had similar problem with iOS. Hope that helps.

Related

How do I start another view controller with no storyboard?

I'm not using a storyboard or anything. I'm just creating the cocoa classes and linking them up individually. I can get to load up the default View Controller which is SplashViewController but i can't get past there.
I have experience in php, android programming and python, but i'm totally clueless on how Obj-C and how the iOS framework works :(
SplashViewController.m
-(void)initializeInterface
{
//Initialize start button
[self.startButton addTarget:self action:#selector(startActivity) forControlEvents:UIControlEventTouchDown];
//Initialize fading backgrounds
[self animateImages];
}
-(void)startActivity
{
PhoneViewController *phoneView = [[PhoneViewController alloc] initWithNibName:#"PhoneViewController" bundle:nil];
[self.navigationController pushViewController:phoneView animated:YES];
}
SplashViewController.h
#import <UIKit/UIKit.h>
#import "PhoneViewController.m"
#class PhoneViewController;
#interface SplashViewController : UIViewController
#property (strong, nonatomic) PhoneViewController * phoneViewController;
#property UIImage *splashbg1;
#property UIImage *splashbg2;
#property (nonatomic, retain) IBOutlet UIImageView *splashbg;
#property (nonatomic, retain) IBOutlet UIButton *startButton;
-(void)initializeInterface;
-(void)animateImages;
-(void)startActivity;
#end
EDIT
classAppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
//Move from delegate view controller to root view controller
self.window.rootViewController=[SplashViewController new];
[self.window makeKeyAndVisible];
return YES;
}
Wrap your splash view controller in a navigation controller.
Otherwise, the navigationController property of your splash view controller is nil and pushViewController has no effect.
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController: splashViewController];
To move from one UIViewController to other UIViewController, you can try the following things
If SecondViewController *secondViewController is the UIViewController you want to move in to, then your can do the following:
[self presentViewController: secondViewController animated:YES completion:nil];
This is when you UIViewController is not embedded inside a UINavigationController.
It is possible to create your view controllers entirely in code without using Storyboards or XIB files, but it's not recommended. It's like trying to write a complex user application in assembler. The state of the art has evolved since the days when that was necessary. There are better tools. Use them.
Creating everything yourself is both quite complex and not very well documented. You are setting yourself up for a very frustrating, error-prone process. I've been doing iOS development pretty much full time since 2009, and I would not attempt this.
That being said, if you are a masochist, you would create your view controller using initWithNibName:bundle:, passing in nil for both parameters, and then implement the loadView method. In loadView you're create your view hierarchy and install it.
If you are new to iOS/Objective-C, DO NOT DO THIS. It is like trying to write a kernel device driver in machine code as your first foray into UNIX.
Change you AppDelegate method as below -
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
UINavigationController *navcon = [[UINavigationController alloc]initWithRootViewController:[SplashViewController new]];
//Move from delegate view controller to root view controller
self.window.rootViewController=navcon;
[self.window makeKeyAndVisible];
return YES;
}
Problem in your code, you have not taken any navigationController, that enables you push or pop UIViewController. Doing above you can use your method -(void)startActivity to Start a new ViewController.

Error "Application windows are expected to have a root view controller" (iOS)

I've created a blank iPhone app project and would like to show a full-screen advertisement during app launch.
I tried to install the ad by following this guideline: https://github.com/mopub/mopub-ios-sdk/wiki/Interstitial-Integration-For-iOS
That's what I've done finally:
Actually all codes are just copied from the previous link.
However, an error shows when app runs:
Application windows are expected to have a root view controller at the end of application launch
I think this error may probably related to the loadView method, because if I remove the loadView method, the error disappeared.
In fact, this error seems common as it can be easily searched on the internet, but I don't know how loadView is related to it, and how can it be solved in my case.
Any solutions? Thanks a lot.
You probably need to do this:
Add
#import "ViewController.h"
to the top of AppDelegate.m
And in AppDelegate.m, your application:didFinishLaunchingWithOptions: method should have some code like this.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// ... Other code
// Override point for customization after application launch.
ViewController *viewController = [[ViewController alloc] init];
self.window.rootViewController = viewController;
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
UIViewController *vc = [[UIViewController alloc] init];
[vc.view addSubview:self.tab_controller.view];
[self.window setRootViewController:vc];
OR
UIViewController *vc = [[UIViewController alloc] init];
[vc.view addSubview:yourClass.view];
[self.window setRootViewController:vc];
If you started with an empty template and added a storyboard, you need to do a couple of things:
You need to delete all the lines (except return statement) inside didFinishLaunchingWithOptions
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
return YES;
}
In project settings ->General, select your storyboard as the main interface
Attached snapshot to help you
At the right side check there is one option under attribute inspector which asks to set as "is rootView controller"

Issue with storyboard

I want to use storyboard in my old project (which was implemented using xibs) for adding a new features.
I have created storyboard file and added a view controller to it and in Identity inspector I have specified the class name for the view controller.
#implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:[[FirstViewController alloc]initWithNibName:#"FirstViewController" bundle:[NSBundle mainBundle]]];
self.window.rootViewController = navController;
[self.window makeKeyAndVisible];
return YES
}
#end
In the firstviewcontroller when i click on a button it will call the gotoSomeviewController method where it pushes to the eventslistViewController loading from EventsScreen storyboard
#implementation FirstViewController
-(void)gotoSomeviewController
{
EventsListViewController *vc = [[UIStoryboard storyboardWithName:#"EventsScreen" bundle:nil] instantiateInitialViewController];
[controller pushViewController:vc animated:YES];
}
#end
when I'm running application the EventsListViewController is showing a empty screen without the views I have added in storyboard.
Based on the information supplied there should be no reason why you mix NIBs and Storyboard.
I would setup just a storyboard. Remove the app Delegate code and setup the project to load the storyboard for the specific device.
Setup your storyboard to have the initial view controller as a UINavigationController that has the FirstViewController as the root of that.
Then you can simply drag to the SecondViewController from the button and select push as the move option. Then remove your method for gotoviewcontroller. There is no reason why you would have this setup like this...

ViewController programmatically?

I would like to know what steps are needed once a fresh "Single view" project was created in xcode, in order to achieve:
1. a viewController that initializes without a NIB, but rather programmatically loads it's own controls in its view.
2. How to get that viewcontroller's view to load and call viewDidLoad?
3. make the view for that controller visible on the screen with all of the controls.
How do I go about this from this function:
-(BOOL)application:(UIApplication*)application didFinishLoadingWithOptions:(NSDictionary *)launchOptions
I am trying to modify a new xcode project but all I get is a black screeen, viewDidLoad doesn't get called
That's your app delegate's application loading method.
In there, you would probably want to create an instance of your custom view controller and assign that as the rootViewController to your app delegate didFinishLoading. There should be a line like:
// app delegate .h file
#import "CustomViewController.h"
#interface
{
...
CustomViewController *myCustomVC;
...
}
#property (nonatomic, retain) CustomViewController *myCustomVC;
// app delegate .m file
#implementation AppDelegate
#synthesize myCustomVC;
-(BOOL)application:(UIApplication*)application didFinishLoadingWithOptions:(NSDictionary *)launchOptions
{
...
myCustomerVC = [[CustomViewController alloc] init];
[self.window setRootViewController:myCustomVC];
...
}
Then inside your custom view controller's viewDidLoad method, you can do this as a test:
// custom view controller .m file
-(void)viewDidLoad
{
self.view.backgroundColor = [UIColor redColor];
}
UIViewController *myViewController = [[UIViewController alloc] init];
[myViewController.view setFrame:self.view.bounds];
[self.view addSubview:myViewController.view]; // if you want to add it in another viewcontroller
// For testing, set the background color to something other than white (default)
[myViewController.view setBackgroundColor:[UIColor greenColor]];
And off you go !
You need to create a subclass of UIViewController, and setup your view hierarchy either in loadView, or viewDidLoad (depending on the level of customisation)
By subclassing UIViewController the loading method calls will be made for you so you don't have to worry about getting getting viewDidLoad etc.
To make it visible on the screen the simplest way is to set it as the rootViewController of the apps window
inside didFinishLaunchingWithOptions: in your app delegate
self.window.rootViewController = [[MyViewControllerSubclass alloc] init];
Try This :
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
HomeViewController *homeVC = [[HomeViewController alloc]init];
[self.window setRootViewController:homeVC];
[self.window makeKeyAndVisible];
return YES;
}
Remove Main(storyboard reference) from Main interface of general Setting :
Add Launch Image :
And select iOS-7 and later in your left corner setting

IOS How to alter an existing UI to use a new navigation controller

Ok, I'm having trouble with this.
I started an Application with a UITableViewController custom class called MainView.
In interface builder I modified the view so that there is a text box and a button on top and a UITableView. Connected the data source and delegate to the MainView class, and programmed in all the code to use the text field as a search field, the button as a search trigger, and then programmed in the proper delegate methods to populate the UITableView. This works perfectly.
Now the next step was to use the - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
method to be able to show a webview with a link related to the selected row. So reading I see that I need to add a UINavigationController to the mix ( so as to get the toolbar and navigation bar etc..).
Now I tried this:
add a navigation controller from the Interface builder, and connect to the appdelegate, and an outlet
#import
#interface ComparateurAppDelegate : NSObject {
UIWindow *window;
UINavigationController *navigationController;
}
#property (nonatomic, retain) IBOutlet UIWindow *window;
#property (nonatomic, retain) IBOutlet UINavigationController *navigationController;
#end
then in the implementation - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[window addSubview:navigationController.view];
[window makeKeyAndVisible];
}
this launches ok, same as before, and I don't have the top bar I should have. plus when I try to push a new view in it does nothing.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
WebViewController *wvc = [[WebViewController alloc] initWithNibName:#"WebViewController.nib" bundle:nil];
[self.navigationController pushViewController:wvc animated:YES];
[wvc release];
}
I know the code is running because I nslog it. but nothing is happening. WebViewController.nib is the nib file I created ( empty right now) so that I populate it with a UIwebview.
My guess at this moment is that the view hierarchy is not set ok.
So I tried a few things I can't remember exactly and got the toolbar on top of the window I already have, but with all the content inaccessible ( like if the toolbar was a modal dialog and I could not use the bottom one , or like a transparent view and you could see underneath to the first window that was stacked).
I also tried creating programatically the UINavigation controller in the appDelegate like so
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
UIViewController *rootController = [[MainView alloc]init];
navigationController = [[UINavigationController alloc]initWithRootViewController:rootController];
[rootController release];
window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[window addSubview:navigationController.view];
[window makeKeyAndVisible];
return YES;
}
And all I got is an empty UITableView for an interface, and not the MainView.nib ( whose class is set as MainView).
TL;DR:
Have an app that is working, want to add detailed view, and need to modify to a UINavigationController but can't seem to find the proper way to do it.
thanks in advance and sorry for the long post.
Try changing this:
UIViewController *rootController = [[MainView alloc]init];
To this:
UIViewController *rootController = [[MainView alloc]initWithNibName:#"MainView" bundle:nil];

Resources