0

XCodeのWebビューにWebページをロードするために使用しようとしているNSStringがあります。ただし、NSString 内のスペースをアンダースコアに置き換える必要があり、すべてのアポストロフィを "%27" に置き換える必要もあります。次に、fullURL NSString の末尾に追加する必要があります。NSString の置換を行うコードの一部を実行するたびに、何も置換されません。元の NSString と同じままです。追加しようとすると、追加されません。

.h ファイル:

@interface WikipediaViewController : UIViewController

@property (weak, nonatomic) NSString* artistName;
@property (weak, nonatomic) IBOutlet UIWebView *webView;

@end

NSString の置換と追加を伴うメソッド:

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSString *fullURL = @"en.wikipedia.org/wiki/";

    [artistName stringByReplacingOccurrencesOfString:@" " withString:@"_"];
    [artistName stringByReplacingOccurrencesOfString:@"'" withString:@"%27"];
    [fullURL stringByAppendingString:artistName];

    NSURL *url = [NSURL URLWithString:fullURL];
    NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
    [webView loadRequest:requestObj];
}

また、artistName 変数は別のクラスから初期化されているため、既に情報が含まれていると仮定してください。

これが機能しない理由を誰かに教えてもらえますか? ありがとう。

4

3 に答える 3

5
[artistName stringByReplacingOccurrencesOfString:@" " withString:@"_"];

実際には、キャプチャする必要がある文字列を返します。

NSString *myNewString = [artistName stringByReplacingOccurrencesOfString:@"    " withString:@"_"];

文字列は多くの言語で不変であるため、メソッドは実際には基になる文字列を変更しません。

于 2012-12-08T18:00:00.900 に答える
2

まず、あなたのプロパティは弱いプロパティであり、おそらく間違っています。弱いのではなくコピーにします。次に、artistName を記述して iVar にアクセスする代わりに、self.artistName を使用して getter にアクセスします (これがベスト プラクティスです)。

次に、最も重要なことですが、stringByReplaceing... の戻り値を、setter を介して iVar に割り当てます (つまり、再び self.artistName を使用します)。今のところ、何もしないメソッドを呼び出すだけです。文字列自体は変更されないため、変更が加えられた文字列の新しいインスタンスが提供されます。あなたの場合、戻り値は決して使用されません。

だから、使う

self.artistName = [self.artistName stringByReplacing.....];

fullURL = [fullURL stringByAppending....];

ただし、artistName は弱いプロパティであるため、文字列はなくなり、fileURL に追加されません。

したがって、プロパティのコピーを作成します

@property (nonatomic, copy) NSString *artistName;

(最新のXcodeとコンパイラのバージョンでは、プロパティが自動的に合成されてアンダースコアがプレフィックスされたiVar(つまり、あなたの場合は_artistName)を持つ必要があるため、コードが最初に機能するのはなぜでしょうか。そのように合成しました。)

于 2012-12-08T18:07:57.767 に答える
1

コードを編集して機能させました

- (void)viewDidLoad
{
[super viewDidLoad];
NSString *fullURL = @"en.wikipedia.org/wiki/";

artistName = [artistName stringByReplacingOccurrencesOfString:@" " withString:@"_"];
artistName = [artistName stringByReplacingOccurrencesOfString:@"'" withString:@"%27"];
fullURL = [fullURL stringByAppendingString:artistName];

NSURL *url = [NSURL URLWithString:fullURL];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
[webView loadRequest:requestObj];
}

stringByReplaceingOccurrencesOfString は、どこかに保存する必要がある文字列を返すことに注意してください。古い artistName 文字列を新しいものに置き換えることは、あなたのケースでは理にかなっています。

于 2012-12-08T18:03:27.207 に答える