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()段階的にそれらをプリントアウト、または、ブレークポイントを設定し、それらが設定されているような値を検査します。
Kevin Conner、

回答:


202

ハードコードされた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];

文字列全体のエスケープによって処理されるので、おそらくlocalizationNameのエスケープを削除できます。


ここでURLWithStringがnilを与える理由を理解しようとしています。Appleのドキュメントでは、「RFC 2396に準拠したURLである必要があります。このメソッドは、RFC 1738および1808に従ってURLStringを解析します。」と述べています。いくつかの読書をしています...
russau

1
LOL、私はメールからURLをコピーしました、そしてこれは起こりました!ありがとう。
エシェロン2015年

1
URLに#が含まれている場合は壊れます。stringByAddingPercentEscapesUsingEncoding#を%2に変換します
Ali Saeed

2
上記のAPIは非推奨です。次のAPIを使用できます webStringURL = [stringURL stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet];
Rushabh

41

ファイルマネージャーに保存されたファイルを扱う場合に使用します。

NSURL *_url = [NSURL fileURLWithPath:path];

ありがとうございました!「途中でトリミングされた」URLを取得していた
codrut

8

使用する必要があると思います-[NSString stringByAddingPercentEscapesUsingEncoding:]Apple docを参照してください。

別のコメントは、古いタイマーとして、ASCII以外の文字をソースファイルに入れるのは少し不安だということです。とは言っても、このAppleのドキュメントによると、10.4以降、内部ではUTF-16文字列で問題ありません@"..."。どういうわけかGCCはLatin-1のソースファイルをバイナリのUTF-16に正しく変換しているようですが、ソースコード内でのみ7ビットASCII文字を使用し、を使用するのが最も安全だと思いますNSLocalizedString


2

私はあなたのアクセント付きの文字が物事をスローしていると思います。それらは、-stringByAddingPercentEscapesUsingEncoding:によって処理されません。



0

URLWithString:呼び出しは、渡された文字列が不正な形式である場合、nilを返します。NSURLは不正なURLに対してnilを返すため、文字列をNSLogし、ブレークポイントを設定して、NSURL作成メソッドに渡されているものを正確に確認します。URLWithStringがハードコードされた値で機能する場合、それは、渡したものがすべて不正な形式であることをさらに証明します。見る


-1

NSStringなしで直接NSURLを使用できます。

//.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]];

そして、(NewsUrl変数を使用して)別のビューからこのビューにURLを渡します。

それを試してみてください。


この回答は、URLWithString:がnilを返す理由を尋ねていた質問にはまったく対応していませんでした。(さらに、文字列をURLに変更する方法も示していません。)
ArtOfWarfare 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.