【问题标题】:Asking WebView to load webpage from different class要求 WebView 从不同的类加载网页
【发布时间】:2010-02-27 14:33:42
【问题描述】:

我有一个 WebView 需要请求从不同的类加载网站。因此我实现了以下功能:

-(void)performResearch:(NSString *)aString {  
    NSLog(@"Received Request!");  
    [[researcher mainFrame]
    loadRequest:[NSURLRequest
    requestWithURL:[NSURL URLWithString:aString]]]; 
}

在我的其他类中,我这样调用函数:

Researcher *res = [[Researcher alloc] init];
[res performResearch:@"http://www.twitter.com"];
[res release];

我没有收到编译器错误,并且确实调用了 NSLog,但是 WebView 没有加载网页。日志中也没有错误。我很困惑。

谁能告诉我怎么了?

【问题讨论】:

    标签: cocoa class webview


    【解决方案1】:
    -(void)performResearch:(NSString *)aString {  
        NSLog(@"Received Request!");  
        [[researcher mainFrame]
        loadRequest:[NSURLRequest
        requestWithURL:[NSURL URLWithString:aString]]]; 
    }
    

    在我的其他类中,我这样调用函数:

    Researcher *res = [[Researcher alloc] init];
    [res performResearch:@"http://www.twitter.com"];
    [res release];
    

    performResearch: 中,您在后面的代码中发送performResearch: 消息的对象是selfresearcher 是其他变量;您正在与可能不是该研究员的不同对象交谈。

    your comment on Colin Gislason's answer 中,您说researcher 不是Researcher,而是WebView。您最好纠正这种不准确的变量名选择。

    将变量重命名为更准确的名称后,例如webView,您需要确保其中有内容。仅仅拥有一个变量是没有帮助的;您需要有一个指向变量中对象的指针。否则,变量中的指针是nil,而发往nil 的消息根本不执行任何操作。它们不会崩溃、不会失败、不会成功、不会中断——执行继续进行,就好像什么都没发生一样,因为它确实发生了。

    你说变量是一个IBOutlet;这意味着您的意思是在 IB 中连接插座。您的问题的一个可能原因是您忘记了这样做,这将解释包含nil 的变量。确保它已在 IB 中连接。

    您的问题的另一个可能原因是该笔尖尚未加载。如果 Researcher 对象拥有 nib,那么加载它通常是它的责任,这意味着您需要这样做。如果某个其他对象正在加载一个同时包含 Researcher 和 WebView 的 nib,那么您在后面的代码 sn-p 中创建 another Researcher 对象是错误的;这第二个 Researcher 对象与 nib 中的对象无关,也不是来自任何来源的 WebView。在后一种情况下,您必须取消创建 Researcher 对象,并使用 nib 中的那个。

    最后一个解决方案可能需要向其类承载第二个代码 sn-p 的对象添加一个出口。我不赞成这种解决方案。很难说你应该做什么,因为我不确定 Researcher 对象在the MVC triumvirate 中的位置。我怀疑您需要更多地考虑它属于哪个类别;我认为它应该是一个控制器,你需要做一些重构来重新建立你应该在权力之间拥有的界限。

    未能在您的应用中支持 MVC 通常会导致 Cocoa 比平时更难使用。

    【讨论】:

    • 我认为问题在于我没有使用同一个实例...我现在需要弄清楚如何将原始对象传递给新类...
    • David Schiefer:看我的倒数第二段。
    【解决方案2】:

    您没有显示researcher 的声明位置,但它看起来像一个普通的实例变量。价值从何而来?

    如果它来自Researcher 类之外,那么它看起来就像是nil,因为您的其他类正在创建一个新的Researcher 实例但没有提供researcher 属性。如果您将消息传递给nil 对象,该消息被忽略。这就是为什么您不会收到错误消息。尝试将加载请求行分成几行并记录对象的值。

    编辑:

    Interface Builder 设置Researcher 类的一个特定实例的UIWebView 属性。要更新该 Web 视图,您需要在同一实例上调用 performResearch。您不能使用新实例,因为它根本不会连接到 Web 视图。

    如果可能,您应该将原始 Researcher 对象传递给新类并改用它:

    [self.researcher performResearch:@"http://www.twitter.com"];
    

    【讨论】:

    • Researcher 在此声明:“@interface Researcher : NSObject {”在名为 Researcher.h 的文件中。我想通过不同的文件访问它。
    • 我的意思是performResearcher方法中的这个研究员:[researcher mainFrame]
    • 如何将原始对象传递给新类?我以前从未这样做过:/
    • 您必须找到原始对象可用的对象或方法,然后将其传递到创建新类的位置。即您的视图控制器可能包含对象 A,该对象 A 创建需要调用 performResearch 的对象 B。您需要将 Researcher 对象从视图控制器向下传递给对象 A,对象 A 会将其传递给对象 A。然后对象 A 可以使用它。如果这是不可能的,单例可能会有所帮助(您可以搜索堆栈溢出以了解如何执行此操作)。
    • 我已经使用“sharedInstance”修复了它。现在效果很好! :-)
    猜你喜欢
    • 2017-07-03
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    相关资源
    最近更新 更多