1

こんばんは

ブラウザ アプリでユーザーが入力した URL を確認しようとしています。目的は、ユーザーが入力しない場合は http:// などのスキームを追加し、テキスト フィールド内にスペースが含まれている場合は Google 検索の後であると想定することです。

私はちょうどそこにいると思いますが、完全な URL ではなくスペースを含まないものを入力すると、次のエラーが原因でクラッシュします。簡単に言えば、

  • 「ナショナル ラグビー リーグ」と入力すると、その検索語で Google が正しく読み込まれます
  • 「 http://www.nrl.com.au 」と入力すると、NRL Web ページが正しく読み込まれます
  • 「www.nrl.com.au」と入力すると、次のエラーが発生します。

キャッチされていない例外 'NSRangeException' が原因でアプリを終了しています。理由: '-[__NSCFString replaceCharactersInRange:withString:]: 範囲またはインデックスが範囲外です'

私は運がない次の同様の質問を見てきました:

iPhoneで(原文のまま)URLを検証する方法

文字列が URL 目的 c であるかどうかを確認する

NSRange クラッシュ アプリ

この質問は私のものと非常に似ていますが、完全には答えられませんでした:

xcodeの目的cでユーザーが送信したURLを修正する

以下の私のコードを見つけてください

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];

NSString *URLString = textField.text;

NSURL *URL = [NSURL URLWithString:URLString];

if (!URL.scheme) {

    NSRange urlSpace = [URLString rangeOfString:@" "];
    NSString *urlNoSpace = [URLString stringByReplacingCharactersInRange:urlSpace withString:@"+"];

    if (urlSpace.location != NSNotFound) {
    // The user typed a space so we assume it's a search engine query
        URL = [NSURL URLWithString:[NSString stringWithFormat:@"http://www.google.com/search?q=%@", urlNoSpace]];
    } else {
    // The user didn't type http: or https: for the scheme
        URL = [NSURL URLWithString:[NSString stringWithFormat:@"http://%@", URLString]];
    }
}

if (URL) {
    NSURLRequest *request = [NSURLRequest requestWithURL:URL];
    [self.webview loadRequest:request];
}

return NO;

}

ご協力いただきありがとうございます。

4

1 に答える 1

1

URL にスペースがない場合、urlSpacealocationNSNotFoundalengthは 0 (または -1?) になります。

作成する範囲を使用する前に、これを確認する必要がありますurlNoSpace

本当にすべてのスペースを変更したいので、単純にしないのはなぜですか:

NSString *urlNoSpace = [URLString stringByReplacingOccurrencesOfString:@" " withString:@"+"];

これにより、2 つの問題が修正されます。最初のスペースだけでなく、クラッシュしてすべてのスペースが置き換えられます。

于 2014-10-16T21:48:48.453 に答える