iPad iPhone:从另一个View Controller类调用Webview

时间:2011-02-24 18:35:21

标签: iphone objective-c ipad uiwebview webview

我是新手,因为我来自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;
        }
    }
}

然后我有一个第三视图控制器,其中包含我想要在webview上显示的新网页的链接。当我在这里调用方法来访问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中调用了代码,但它似乎没有显示新页面。没有错误或警告,任何想法?谢谢

2 个答案:

答案 0 :(得分:1)

如果可以的话,如果您将Web视图旋转为自己的视图控制器,那么您的生活将更加轻松,您的应用程序将更加灵活。

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

有可能代码看起来更像这样:

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

答案 1 :(得分:0)

这里有一些值得注意的事情。

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

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

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

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

您需要将ViewView中的RootViewController对象传递给ViewController,或者将其放在一个全局可访问的位置,就像在您的app delegate子类中一样,并执行以下操作:

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

如果您可以评论您正在考虑的这两个选项中的哪一个,我可以提供更直接的答案。