iPhone:nib文件+代码=混淆

时间:2011-04-08 15:19:18

标签: iphone nib uiwebviewdelegate

我对使用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 (File's Owner)

PostViewController.xib (Web View)

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

非常感谢...帮助我不再为另一天敲打我的脑袋:)

2 个答案:

答案 0 :(得分:3)

当您致电postViewController.webView时,请确保setDelegate:不为零。还要确保没有在其他地方调用它,并确保代理插座没有连接到NIB中的任何内容。

其他几条评论:

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

  2. [PostViewController release]正在发布类对象。不是个好主意。相反,您应该致电[postViewController release]

答案 1 :(得分:1)

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

[postViewController.webView setDelegate:postViewController];

您可以将此行放在pushViewController:animated:下方,然后webView应该已经存在。