0

我有一个 NSString,我试图用它在 XCode 中的 Web 视图上加载网页。但是,我需要将 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(这是最佳实践)。

其次 - 也是最重要的 - 通过 setter(即 self.artistName 再次)将 stringByReplacing... 的返回值分配给您的 iVar。现在你只需调用什么都不做的方法,因为它本身并没有改变字符串,它给出了一个带有所做更改的字符串的新实例。在您的情况下,从不使用返回值。

所以,使用

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

fullURL = [fullURL stringByAppending....];

但由于 ArtistName 是一个弱属性,该字符串将消失,因此不会附加到您的 fileURL。

所以制作你的财产副本

@property (nonatomic, copy) NSString *artistName;

(我想知道为什么您的代码首先可以工作,因为使用最新的 Xcode 和编译器版本,您的属性应该自动合成为具有下划线前缀的 iVar(即在您的情况下为 _artistName)。所以只写 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];
}

请记住, stringByReplacingOccurrencesOfString 返回一个字符串,您必须将其保存在某处,在您的情况下用新字符串替换旧的 artistName 字符串是有意义的。

于 2012-12-08T18:03:27.207 回答