iOS - ViewController 类型为 MyCustomViewController

iOS - ViewController of type MyCustomViewController

我有我的 ViewController,MyWebViewController,我使用 webView,在 xib 中创建。 .h 文件有

@interface MyWebViewController : UIViewController
@property (nonatomic,strong) IBOutlet UIWebView* webView;

.m 文件中,

- (void)viewDidLoad {
     [super viewDidLoad];
     [self.webView loadRequest:[NSURLRequest requestWithURL:[[NSURL alloc] initWithString:@"http://www.google.com"]]];
}

这是我的xib

它非常适合我。

稍后我创建了另一个 ViewController、RootViewController 类型 MyWebViewController

#import "MyWebViewController.h"

@interface RootViewController : MyWebViewController

MyViewViewController 的 xib 已按预期加载,但 webView 未加载到 xib。我花了更多时间进行调试。

后来,我从 xib 中删除了 webView 并以编程方式创建了它。

self.webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 441)];
self.webView.delegate = self;
[self.webView loadRequest:[NSURLRequest requestWithURL:[[NSURL alloc] initWithString:@"http://www.google.com"]]];
[self.view addSubview:self.webView];

以编程方式创建 webView 会给出预期的输出。

我需要澄清一点,为什么我的 webView 在 xib 中创建时未加载,而在以编程方式创建时工作正常?

在您的 RootViewController 中,您是否调用了:

- (void)viewDidLoad {
     [super viewDidLoad];
}

这样它会触发基础 class 函数并且 webView 会正常加载。你忘了把它也放在 MyWebViewController 中。

编辑:

self.webView 未在派生 class 中加载的原因是因为它被标记为 IBOutlet,因此它需要来自 UIView 的预分配元素的引用或xib 并且在派生的 class 中,我们 不是 实例化基本视图文件,例如 MyWebViewController.xib。所以 self.webView 出现 nil 并且对 nil 的函数调用被默默地忽略。所以,一旦你通过代码完成它,它就独立于 xib 文件并且可以工作。

希望对您有所帮助!

这是由于 iOS9 视图加载行为发生了变化。开发人员应该更新 -viewWillLayoutSubviews-viewDidAppear 中的 UI 元素。