0

我对何时应该使用 NIB 文件以及何时应该使用代码感到有些困惑。这是我的问题:

我有一个带有 RootController 及其 NIB 文件的基于导航的应用程序。RootController 的 NIB 文件包含一个 TableView。当我单击一个单元格时,我会使用加载内容的请求初始化一个新连接。当连接完成加载后,我从 NIB 文件创建一个新的 postViewController(自定义),然后将其推送到 navigationController viewController 堆栈上,如下所示:

PostViewController *postViewController = [[PostViewController alloc] initWithNibName:@"PostViewController" bundle:[NSBundle mainBundle]]; 

[postViewController.webView setDelegate:self];

postViewController.postContent = [[postsData objectForKey:@"post"] objectForKey:@"content"];

[self.navigationController pushViewController:postViewController animated:YES];

[PostViewController release];

然后,如您所见,我尝试将 rootViewController 设置为 webView 的委托,以便能够拦截对链接的单击并将新的 ViewController 推送到堆栈上。我需要那个新视图来拥有带有后退按钮的导航栏。

问题:看起来 setDelegate 不起作用,因为 webView:shouldStartLoadWithRequest:navigationType 永远不会被调用!

我想我应该在 NIB 文件中设置委托,但我不知道如何。PostViewController 中的 NIB 文件不知道 RootViewController...

以下是 NIB 文件的屏幕截图:

RootViewController.xib

PostViewController.xib(文件所有者)

PostViewController.xib(网页视图)

如果您需要更多详细信息,请询问我。

非常感谢......帮助我不再敲我的头一天:)

4

2 回答 2

3

当你调用它时,确保postViewController.webView它不为零setDelegate:。还要确保它没有在其他任何地方被调用,并确保委托插座没有连接到您的 NIB 中的任何东西。

其他一些评论:

  1. 在这种情况下,将根视图控制器用作 webview 的委托有点不寻常。它应该可以工作,但是将这些委托方法向下移动到 PostViewController 中可能更有意义。从那里您仍然可以拦截链接点击并调用[self.navigationController pushViewController:animated:].

  2. [PostViewController release]正在释放类对象。不是一个好主意。相反,您应该调用[postViewController release].

于 2011-04-08T15:43:45.913 回答
1

[postViewController.webView setDelegate:self];设置当前 Controller 的委托 not postViewController。尝试:

[postViewController.webView setDelegate:postViewController];

你可以把这一行放在下面,pushViewController:animated:那么 webView 应该已经存在了。

于 2011-04-08T15:45:11.147 回答