URLWithString:返回nil


93

这可能很容易,但是我似乎不知道为什么URLWithString:在这里返回nil。

//localisationName is a arbitrary string here
NSString* webName = [localisationName stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
NSString* stringURL = [NSString stringWithFormat:@"http://maps.google.com/maps/geo?q=%@,Montréal,Communauté-Urbaine-de-Montréal,Québec,Canadae&output=csv&oe=utf8&sensor=false&key=", webName];
NSURL* url = [NSURL URLWithString:stringURL];

1
webName致电之前有什么价值stringWithFormat:?那么,stringURL致电之前的价值是什么URLWithString:?用于NSLog()逐步打印它们,或设置断点并检查设置的值。
凯文·康纳

Answers:


203

您还需要转义硬编码URL中的非ASCII字符:

//localisationName is a arbitrary string here
NSString* webName = [localisationName stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
NSString* stringURL = [NSString stringWithFormat:@"http://maps.google.com/maps/geo?q=%@,Montréal,Communauté-Urbaine-de-Montréal,Québec,Canadae&output=csv&oe=utf8&sensor=false", webName];
NSString* webStringURL = [stringURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL* url = [NSURL URLWithString:webStringURL];

您可能可以删除localisationName的转义,因为它将由整个字符串的转义来处理。


试图理解为什么URLWithString在这里给出nil。苹果文档说:“必须是符合RFC 2396的URL。此方法根据RFC 1738和1808解析URLString。”。做一些阅读...
russau 2014年

1
大声笑,我从电子邮件中复制了一个URL,然后发生了!谢谢。
梯队2015年

1
如果URL中包含#,则中断。stringByAddingPercentEscapesUsingEncoding将#转换为%2
Ali Saeed

3
以上API已弃用。您可以使用以下API webStringURL = [stringURL stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet];
Rushabh


8

我想你需要使用-[NSString stringByAddingPercentEscapesUsingEncoding:]。请参阅Apple文档

另一条评论是,作为旧计时器,我发现将非ASCII字符放入源文件中有点不容易。就是说,这位苹果医生说,从10.4开始,里面的UTF-16字符串就可以了@"..."。GCC似乎以某种方式正确地将Latin-1中的源文件转换为二进制格式的UTF-16,但我认为仅在源代码内部使用7位ASCII字符并使用最为安全NSLocalizedString


2

我认为您的重音人物正在丢东西。它们不会由-stringByAddingPercentEscapesUsingEncoding:处理。



0

如果传递给它的字符串格式错误,则URLWithString:调用将返回nil。由于NSURL对于格式错误的URL返回nil,因此NSLog您的字符串并设置断点以确切查看传递给您的NSURL创建方法的内容。如果您的URLWithString使用硬编码值,则可以进一步证明所传递的内容格式错误。看到


-1

您可以直接使用NSURL而不使用NSString。

//.h文件

@interface NewsBrowser : UIViewController {

    UIWebView *webView;
    NSURL *NewsUrl;

}

@property (nonatomic, retain) IBOutlet UIWebView *webView;

@property(nonatomic,assign)NSURL *NewsUrl;

@end

//.m文件

[webView loadRequest:[NSURLRequest requestWithURL:NewsUrl]];

然后将URL从另一个视图(使用NewsUrl变量)传递给该视图。

试试吧。


这个答案根本没有解决问题,这是在问为什么URLWithString:返回nil。(此外,您甚至没有显示将字符串更改为URL的方法。)
ArtOfWarfare 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.