Objective-C:stringByReplacingOccurrencesOfStringwithString和stringByAppendingString不工作

时间:2012-12-08 17:55:56

标签: objective-c xcode

我有一个NSString,我试图在XCode中的Web View上加载网页。但是,我需要用下划线替换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变量是从不同的类初始化的,所以假设它已经包含了信息。

谁能告诉我为什么这不起作用?感谢。

3 个答案:

答案 0 :(得分:5)

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

实际上会返回一个你需要捕获的字符串,所以。

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

字符串在许多语言中都是不可变的,因此方法实际上不会修改底层字符串。

答案 1 :(得分:2)

首先,你的财产是一个弱财产,很可能是错误的。让它复制而不是弱。然后,不是编写artistName来访问iVar而是使用self.artistName来访问getter(这是最佳实践)。

其次 - 最重要的是 - 通过setter将stringByReplacing ...的返回值赋给你的iVar(再次是self.artistName)。 现在你只调用没有做任何事情的方法,因为它不会改变字符串本身,它给出了一个带有所做更改的字符串的新实例。在您的情况下,永远不会使用返回值。

所以,使用

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

fullURL = [fullURL stringByAppending....];

但是因为artistName是一个弱属性,所以字符串将消失,因此不会附加到你的fileURL。

所以制作你的财产副本

@property (nonatomic, copy) NSString *artistName;

(我想知道为什么你的代码首先起作用,因为使用最新的Xcode和编译器版本,你的属性应该自动合成为具有下划线前缀的iVar(在你的情况下是_artistName)。所以只写artistName不应该工作,除非你以这种方式合成。)

答案 2 :(得分: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字符串。