我有一个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没有加载网页。日志中也没有错误。我很困惑。
有谁能告诉我出了什么问题?
答案 0 :(得分:2)
-(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:
消息的对象为self
。 researcher
是其他变量;你正在和另一个可能不是这个研究员的对象交谈。
在your comment on Colin Gislason's answer中,您说researcher
不是研究员,而是WebView。你最好纠正这个不准确的变量名选择。
一旦您将变量重命名为更准确的内容,例如webView
,您就需要确保其中包含某些内容。简单地拥有变量是没有用的;你需要有一个指向变量中对象的指针。否则,变量中的指针为nil
,而nil
的消息根本不执行任何操作。它们不会崩溃,它们不会失败,它们不会成功,它们不会中断执行,就好像什么也没发生一样,因为它确实发生了。
你说变量是IBOutlet;这意味着你的意思是在IB中连接插座。导致问题的一个可能原因是您忘了这样做,这可以解释包含nil
的变量。确保它已在IB中连接。
问题的另一个可能原因是此笔尖尚未加载。如果Researcher对象拥有nib,那么通常它负责加载它,这意味着你需要这样做。如果其他一些对象正在加载带有Researcher和WebView的nib,那么在后面的代码片段中创建另一个 Researcher对象是错误的;第二个Researcher对象与nib中的对象无关,也没有来自任何源的WebView。在后一种情况下,您必须删除Researcher对象的创建,并使用笔尖中的对象。
最后一个解决方案可能需要向其类承载第二个代码段的对象添加插座。我不赞成这个解决方案。很难说你应该做什么,因为我不确定研究者对象在the MVC triumvirate中的位置。我怀疑你需要更多地思考它属于哪个类别;我认为它应该是一个控制器,并且你需要进行一些重构来重新建立你应该在权力之间建立的界限。
未能在您的应用中维护MVC通常会导致Cocoa比平常更难使用。
答案 1 :(得分:0)
您没有显示声明researcher
的位置,但它看起来像一个普通的实例变量。价值来自哪里?
如果它来自Researcher
类之外,则它看起来像nil
,因为您的其他类正在创建新的Researcher
实例,但未提供researcher
类attribute ..如果将消息传递给nil
对象,则会忽略该消息。这就是为什么你没有得到错误。尝试将加载请求行分成几行并记录对象的值。
编辑:
Interface Builder设置UIWebView
类的一个特定实例的Researcher
属性。要更新该Web视图,您需要在同一实例上调用performResearch
。您无法使用新实例,因为它根本不会连接到Web视图。
如果可能,您应该将原始Researcher
对象传递给新类并改为使用它:
[self.researcher performResearch:@"http://www.twitter.com"];