以编程方式覆盖 loadView 和设置 rootViewController,没有 Storyboard

Posted

技术标签:

【中文标题】以编程方式覆盖 loadView 和设置 rootViewController,没有 Storyboard【英文标题】:Overriding loadView and setting rootViewController programmatically, no Storyboard 【发布时间】:2014-11-22 01:20:01 【问题描述】:

我正在尝试以编程方式创建并设置View 作为根View。我没有使用 Storyboard 或 ARC。

我正在尝试将UIWebView 设置为我的ViewController'sView,但我无法做到。当我运行以下代码时,我看到一个带有空白屏幕的NavigationBar。我尝试将常规UIView 设置为根View,并将其背景颜色设置为蓝色,它已加载,因此问题似乎特定于UIWebView。 如果有人能指出我做错了什么,我将不胜感激。谢谢!

这是我的loadView 代码:

// in GmailOAuthViewController.m
- (void)loadView 

    CGRect frame = [[UIScreen mainScreen] bounds];
    UIWebView *webView = [[[UIWebView alloc] initWithFrame:frame] autorelease];

    self.view = webView;

这是我的application:didFinishLaunchingWithOptions: 代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

    CGRect frame = [[UIScreen mainScreen] bounds];
    UIViewController *viewController = [[GmailOAuthViewController alloc] init];
    self.navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];

    self.window = [[UIWindow alloc] initWithFrame:frame];
    self.window.backgroundColor = [UIColor whiteColor];
    self.window.rootViewController = self.navigationController;
    [self.window makeKeyAndVisible];

    return YES;

【问题讨论】:

【参考方案1】:

您正在分配 self.view... 如果您分配 webView 查看其他所有内容 试试

[self.view addSubview: webView]    

这是我刚刚尝试过的代码,它可以工作

CGRect frame = [[UIScreen mainScreen] bounds];
    UIViewController *viewController = [[ViewController alloc] init];
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];

    self.window = [[UIWindow alloc] initWithFrame:frame];
    self.window.backgroundColor = [UIColor whiteColor];
    self.window.rootViewController = navigationController;
    [self.window makeKeyAndVisible];

在 ViewController.m 中

-(void)viewDidAppear:(BOOL)animated
    CGRect frame = self.view.bounds;
    UIWebView *webView = [[UIWebView alloc] initWithFrame:frame] ;
    webView.delegate = self;
    self.view = webView;

    NSString *thePath = [[NSBundle mainBundle] pathForResource:@"ViewControllerCatalog" ofType:@"pdf"];
    if (thePath) 
        NSData *pdfData = [NSData dataWithContentsOfFile:thePath];
        [(UIWebView *)self.view loadData:pdfData MIMEType:@"application/pdf"
                        textEncodingName:@"utf-8" baseURL:nil];
    


对不起,我之前告诉过你错了,你实际上分配给查看

【讨论】:

您好,感谢您的回复。如果我进行更改,则屏幕永远不会从版权屏幕过渡。除了 UIWebView 之外,我没有创建任何父视图,并且没有使用情节提要。我想将它设置为根View 并以编程方式显示它。 上面的代码可以工作,我只是将具有该名称的 pdf 放入 Xcode 中,一切都很好。我猜您的导航控制器属性干扰了现有属性 谢谢,我自己乱来,发现UIWebView类没有地址栏,所以我无法识别为UIWebview。

以上是关于以编程方式覆盖 loadView 和设置 rootViewController,没有 Storyboard的主要内容,如果未能解决你的问题,请参考以下文章

iOS UITableView 在设置 TableHeaderView 后以编程方式覆盖自动布局约束

以编程方式设置为根视图控制器时,视图控制器无法正确显示子视图

在 -init 或 -loadview 中初始化视图(按钮、标签等)

在android中以编程方式覆盖文本到语音设置中的“始终使用我的设置”选项

Android:以编程方式覆盖 Button minheight

在Swift 3中以编程方式创建一个没有XIB的NSViewController