【问题标题】:Objective-C: initWithContentsOfURL returning nullObjective-C:initWithContentsOfURL 返回 null
【发布时间】:2011-02-14 18:18:02
【问题描述】:

我正在开发一个可以显示远程 html 并使用本地图像的应用程序,所以我要做的是下载网站的 HTML 并将其显示为“本地”页面,这样可以访问到我的包中的图像。

由于某种原因,我无法让 initWithContentsOfURL 工作。我检查了我能找到的所有手册和示例,似乎我做对了,但是这件事不起作用,一直返回 null。使用NSURLRequest requestWithURL 加载的同一页面可以正常工作。

代码如下:

- (void)awakeFromNib 
{
    appURL = @"http://dragontest.fantasy-fan.org";
    notConnectedHTML = @"Could not connect.";

    NSString *seedString = [[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@/seed.php", appURL]]];

    NSString *HTMLdata = @"";

    if (seedString = @"(null)") {
        NSLog(@"Can't connect on awakeFromNib.");
        HTMLdata = notConnectedHTML;
    }else {
        HTMLdata = [NSString stringWithFormat:@"<body style='padding:0px;margin:0px;'>%@%@</body>", seedString, @"<br><img src='images/Default.png'>"];
    }   
    [homeView loadHTMLString:HTMLdata baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] resourcePath]]];
}

【问题讨论】:

    标签: objective-c iphone initwithcontentsofurl


    【解决方案1】:

    首先,为什么不将appURLnotConnectedHTML 声明为NSString *?他们在其他地方是这样声明的吗?

    其次,您最好使用NSURL-urlWithString:relativeToURL: 来创建实际的请求 URL。

    第三(我怀疑这是你的实际问题),比较两个 C 原语,你使用=== 是赋值运算符(它使左边的东西等于右边的东西)。要比较两个 Objective-C 对象,请使用比较方法,例如 -isEqual:-isEqualToString:(专门针对 NSStrings)。

    所以而不是:

    if (seedString = @"(null)")
    

    你应该使用

    if ([seedString isEqualToString:@"(null)"])
    

    但是我怀疑您尝试与“(null)”进行比较的原因是因为当对象等于nilNSLog 会吐出。当一个对象是nil时,对象引用本身就等于nil常量,所以你应该用这个来判断一个对象是不是nil

    if (seedString == nil)
    

    为了更好的衡量,有些人喜欢使用这种语法,它做的事情完全相同:

    if (!seedString)
    

    【讨论】:

    • 哇,我本可以寻找 100 年,但我不会在那里寻找解决方案。谢谢尼克! :) 这样一个菜鸟的错误我简直不敢相信,呵呵我不明白你使用urlWithString:relativeToURL: 是什么意思,这与我使用的相比有什么更好/不同?是的,一开始的这两个变量是全局的。
    • NSString 不符合原语的条件,恐怕,但你是对的,比较两个字符串时 == 不是最好的方法。 NSString 确实为此提供了自己的方法: if ([seedString isEqualToString:@"(null)"])
    • 没问题!如果将appURL 存储为NSURL 而不是NSString,则可以使用[NSURL urlWithString:@"/seed.php" relativeToURL:appURL]。通常在 Cocoa/CocoaTouch 编程中,您将 URL 存储为 NSURL 对象而不是 NSStrings。我刚刚写的方式更具可读性,但会和你已经写的完全一样。
    • @Elise 澄清一下 - -[NSString isEqual:]-[NSString isEqualToString:] 在比较两个 NSString 时都做同样的事情,但有细微的差别。你说得对,我应该使用-isEqualToString:,因为正如文档所说,它比-isEqual: 快。另一个显着的区别是-isEqualToString: 处理重音、变音符号等。人。不同:参见NSString 文档here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    相关资源
    最近更新 更多