【问题标题】:WebView not responding when called from a method从方法调用时 WebView 没有响应
【发布时间】:2010-04-18 11:16:09
【问题描述】:

我有一个带有 tabbar 和 webview 的应用程序。每次用户点击该栏时,我都试图让应用程序返回默认网址。现在我正在拦截点击并启动一个方法,但是它不会影响我的 webview(它没有加载页面)。该方法在从类中调用时可以正常工作,但在我的应用程序委托中调用时不能正常工作,我正在拦截水龙头。

我怀疑它与我创建 SecondViewController 对象的方式有关,它没有指向 webview,但我不知道我做错了什么。

代码如下:

第二个视图头(WebView所在的位置)

@interface SecondViewController : UIViewController {
IBOutlet UIWebView *secondView;
}
- (void) goToPage;

二次视图实现

#import "SecondViewController.h"
@implementation SecondViewController
- (void)awakeFromNib 
{
    [self goToPage];
}

- (void) goToPage
{
    NSLog(@"go to page");
    NSString *newURL = [NSString stringWithFormat:@"http://pageurl"];
    [secondView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:newURL]]];
}

我的应用委托,我在其中调用 SecondViewController 类方法:

#import "RedDragonAppDelegate.h"
#import "SecondViewController.h"

@implementation RedDragonAppDelegate

@synthesize window;
@synthesize rootController;

- (void)applicationDidFinishLaunching:(UIApplication *)application {    
    // Override point for customization after application launch
    [window addSubview:rootController.view];
}

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {

    NSLog(@"didSelectViewController %d", rootController.selectedIndex);

    SecondViewController * sv = [[SecondViewController alloc] init];

    if (rootController.selectedIndex == 0){
        //NSLog(@"if in didSelectViewController 0");
    } else if (rootController.selectedIndex == 1) {
        //NSLog(@"if in didSelectViewController 1");
        [sv goToPage];
    }
}

感谢您的帮助!

【问题讨论】:

  • 我假设您实际上在日志中看到了go to page,所以您知道正在调用goToPage。原始 URL 和新 URL 是否相同?如果您将newURL(在NSURL URLWithString: 中)替换为@"http://www.google.com/",来自goToPage 的呼叫是否有效?
  • 哈哈,如果我不检查明显的内容,我就不会发布它:) 事实上,我知道该函数正在执行,并且我确定新的 URL 没有被加载。不过,我确实解决了一半的问题。当我改变 [ptr goToPage];到 [self goToPage];它开始工作但是......我仍然需要从另一个班级打电话给它。当我像这样创建对象时: SecondViewController *ptr = [[SecondViewController alloc] init];该函数被执行,但是 webview 没有被激活。 :(知道为什么吗?
  • secondView 是如何设置的?也许存在保留/释放/自动释放问题?
  • 我真的不知道那是什么意思 :) 我这样设置:@interface SecondViewController : UIViewController { IBOutlet UIWebView *secondView; }
  • 所以secondView 是您在Interface Builder 中连接的IBOutlet(从SecondViewController 实例的IBOutlet 连接到实际的UIWebView)。在之前的评论中,您说[self goToPage] 有效,但是当您从SecondViewController 之外的其他地方调用它时,它不起作用。您能否编辑您的问题以包含调用goToPage 的不起作用的代码?

标签: iphone objective-c uiwebview methods


【解决方案1】:

如果我理解正确,您在 Interface Builder 中有一个 SecondViewController 实例,其中 secondView 连接到 UIWebView 实例。你想要做的是从RedDragonAppDelegate 调用SecondViewController 实例上的goToPage。 (特别注意,我说的是其中的实例——我相信这是根本问题。)

tabBarController:didSelectViewController:中,当你做SecondViewController * sv = [[SecondViewController alloc] init];时,你正在创建一个SecondViewController的新实例,你可以调用它的goToPage方法,但是sv不是出现的SecondViewController的同一个实例在 Interface Builder 中并且将 secondView 连接到 UIWebView (即,当您创建 SecondViewController 的新 instance 时,ivar secondView 未设置并且似乎是 nil , 但不知道保证是nil)。

你可能(*)想要做的是将IBOutlet SecondViewController *sv;添加到RedDragonAppDelegate@interface,确保你在Interface Builder中有一个RedDragonAppDelegate的实例,连接新的IBOutlet sv RedDragonAppDelegate到Interface Builder中SecondViewController的实例,并删除tabBarController:didSelectViewController:中定义和初始化sv的行。

(*) 我不是 100% 确定这一点,因为我不做 iPhone 的东西,我不知道你的各种视图/对象/等。被安排在 XIB/NIB 文件中,但如果一切都在一个 XIB/NIB 文件中,我很确定它会工作。

【讨论】:

  • 艾萨克,你真是个天才!您发现了问题并以我可以理解的方式(以我有限的知识)解释了解决方案!坚持下去,伙计! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多