4

我正在用 UITableView 构建一个 iPhone 应用程序。在选择一行时,我希望在加载特定 URL 时推送 UIWebView。

我目前有:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath  {
NSDictionary * story = [stories objectAtIndex:[indexPath row]]; 
NSString * storyLink = [NSString stringWithFormat:[story objectForKey:@"link"]];

    [[self navigationController] pushViewController:[[FirstViewController alloc] initWithNibName:@"FirstView" bundle:[NSBundle mainBundle]] animated:YES];
}

如何获得滑入以包含 UIWebView 并随后通过以下方式将故事链接加载到其中的新视图:

loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:storyLink]]

提前致谢,

本吉

4

5 回答 5

9

正如其他人所说,一般的想法是在 FirstViewController 上有一个属性来存储它需要加载的 URL,然后在视图出现时将该 URL 加载到 UIWebView 中。

这是一个从标题开始的示例:

@interface FirstViewController : UIViewController {
  UIWebView *webView;
  NSURL *storyURL;
}
@property (nonatomic, retain) IBOutlet UIWebView *webView; // this is set up in your nib
@property (nonatomic, retain) NSURL *storyURL;
@end

现在进行实施:

@implementation FirstViewController

@synthesize webView;
@synthesize storyURL;

- (void)dealloc;
{
  [storyURL release]; // don't forget to release this
  [super dealloc];
}

- (void)viewDidAppear:(BOOL)animated;
{
  // when the view appears, create a URL request from the storyURL
  // and load it into the web view
  NSURLRequest *request = [NSURLRequest requestWithURL:self.storyURL];
  [self.webView loadRequest:request];
}

- (void)viewWillDisappear:(BOOL)animated;
{
  // there is no point in continuing with the request load
  // if somebody leaves this screen before its finished
  [self.webView stopLoading];
}
@end

所以现在你需要在控制器中为前一个视图做的就是获取故事 URL,将它传递给 FirstViewController 并推送它。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath  {
  NSDictionary *story = [stories objectAtIndex:[indexPath row]]; 
  NSURL *storyURL = [NSURL URLWithString:[story objectForKey:@"link"]];
  FirstViewController *firstViewController = [[FirstViewController alloc] initWithNibName:@"FirstView" bundle:[NSBundle mainBundle]]; // I'm pretty sure you don't need to pass in the main bundle here
  firstViewController.storyURL = storyURL;
  [self.navigationController pushViewController:firstViewController animated:YES];
  [firstViewController release]; // don't leak memory
}

就是这样。其他几点:

  • 我假设您的字典中的“链接”值已经是一个字符串 - 如果是这种情况,则不需要在您的原始示例中构建一个全新的字符串。正如您在我的示例中所看到的,我们可以直接使用此字符串来创建NSURL实例。

  • 在您的原始代码中,当您分配/初始化您的 FirstViewController 时,您将其直接传递到pushViewController. 这会造成内存泄漏,因为一旦UINavigationController完成(在它从导航堆栈中弹出之后),它的保留计数仍然是 1。至少你应该调用autorelease,但这里最有效的做法是简单地分配/初始化它,将它存储在一个临时变量中,然后release在我们推送它之后直接调用。这确保了一旦它从导航堆栈中弹出,它将被释放。

于 2009-07-24T17:48:43.743 回答
1

首先,您的项目中是否有一个名为“FirstView”的笔尖?

其次,我通常这样做的方式是实例化 ViewController 并在将其推送到导航堆栈之前将参数传递给它。

UIViewController *myViewController = [[FirstViewController alloc] initWithNibName:@"FirstView" bundle:[NSBundle mainBundle]];
myViewController.story = storyLink;
[[self navigationController] pushViewController:myViewController animated:YES];
于 2009-07-24T15:41:15.813 回答
0

要获取 uiwebview,只需使用 Interface Builder 创建它或将其定义为您正在加载的视图控制器中的实例变量。之后使用 nsurlrequest 将起作用

于 2009-07-24T15:35:11.860 回答
0

最好的方法是创建一个包含 webview 的新视图控制器类。该视图控制器将具有一个url属性,该属性在viewDidLoad.

于 2009-07-24T15:35:23.827 回答
0

为此,您可以在 FirstViewController 中制作一个 IBOutlet webview,然后通过制作 FirstViewController 的对象发送 url 链接

object.urllink = storyUrl;

然后您可以在 UIWebView 中打开该链接.....

于 2012-03-27T11:31:09.777 回答