【问题标题】:iPad iPhone: Calling Webview from anther View Controller classiPad iPhone:从另一个视图控制器类调用 Webview
【发布时间】:2011-02-24 18:35:20
【问题描述】:

我是 C++ 和 Perl 背景的新手。试图从书本中学习,但他们缺少一些 Objective-C 的核心概念。我需要一些关于此代码的帮助来拉网页:

RootViewController.m

    - (void)fetchWebsite:(NSString*)website{
    NSLog(@"address: %@", website);

    NSString *urlAddress = website;
    NSURL *url = [NSURL URLWithString:urlAddress];
    NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
    [webImageDisplay loadRequest:requestObj];
    [webImageDisplay release];
}

- (void)viewDidLoad {
    [self fetchWebsite:@"website here"];
    [super viewDidLoad];
}

这段代码工作得很好,但我遇到的问题是从另一个类调用这个方法,如下面的代码:

我正确地从第二个视图控制器调用详细视图控制器,如下所示:

SubViewController.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // Navigation logic may go here. Create and push another view controller.
    switch (indexPath.row) {
        case 0: { 
            AnotherViewController *cViewController = [[AnotherViewController alloc] initWithNibName:@"AnotherViewController" bundle:nil];
            cController.contentSizeForViewInPopover = CGSizeMake(320, 350);
            [self.navigationController pushViewController:cViewController animated:YES];
            [cViewController release];
            break;
        }
        case 1: {
            break;
        }
    }
}

然后我有一个第三个视图控制器,其中包含指向我希望在 web 视图上显示的新网页的链接。当我调用这里的方法访问RootViewController中的函数时,它似乎没有响应。

AnotherViewController.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    NSString *itemRequested = [conusItems objectAtIndex:indexPath.row];
    NSLog(@"logging: %@", itemRequested);

    RootViewController *parent = [[RootViewController alloc] init];
    [parent fetchWebsite:@"another website here"];

    [itemRequested release];

}

我单击表格视图上的按钮,我看到代码正在使用 NSLog 在 RootViewController 中调用,但它似乎没有显示新页面。没有错误或警告,有什么想法吗?谢谢

【问题讨论】:

    标签: iphone objective-c ipad uiwebview webview


    【解决方案1】:

    如果可以的话,如果您将 Web 视图作为自己的视图控制器进行旋转,您的生活会更轻松,您的应用程序也会更灵活。

    真正的问题是您没有导航到 Web 视图控制器(并且您可能没有正确初始化它。)

    代码看起来更像这样:

    MyWebViewController *webVC = [[MyWebViewController alloc] initWithNibName:@"MyWebViewContorller" bundle:nil];
    webVC.address = @"whatever";
    [self.navigationController pushViewController:webVC animated:YES];
    [webVC release];
    

    【讨论】:

      【解决方案2】:

      这里有几件事值得注意。

      • 在 didSelectRowAtIndexPath 中,您正在创建一个视图控制器,但您没有呈现它,因此没有可见的副作用。从表格视图中呈现“详细”视图控制器的典型做法是:

      MenuItemOrderVC *vc = [[MenuItemOrderVC alloc] initWithNibName:@"MenuItemOrderVC" bundle:nil];
      [self.navigationController pushViewController:vc animated:YES];
      [vc release];
      

      这会创建视图控制器类的新实例,并通过推送到导航控制器的堆栈来呈现它。这是显示详细视图的常用方式。

      如果你想要做的实际上是在另一个已经存在的视图控制器上显示数据(并且现在隐藏了?),那么你不应该分配一个新的 RootViewController (给定名称,你可能不应创建多个,通常“根”视图控制器是您的 VC 堆栈的基础,并且在整个应用程序中只存在一个,但这不是一个硬性规定)。相反,您需要一种方法来获取指向您已经存在的 RootViewController 的对象指针。

      您需要将 RootViewController 对象从 ViewController 传递到 ViewController,或者将其放在全局可访问的位置,例如在您的应用委托子类中,然后执行以下操作:

      MyAppDelegate *appDel = (MyAppDelegate *) [[UIApplication sharedApplication] delegate];
      RootViewController *rvc = appDel.rootViewController;
      

      如果你能评论一下你想到的这两个选项中的哪一个,我可以给出更直接的答案。

      【讨论】:

      • 抱歉没有详细说明。我正在尝试这样做mobiforge.com/designing/story/…,但其中的第三个视图控制器似乎无法从 rootController 正确调用 webview 来拉出一个新页面。
      猜你喜欢
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-12
      • 2017-04-08
      相关资源
      最近更新 更多