2012-12-08 31 views
0

我有一個NSString,我試圖用它來在XCode的Web視圖中加載一個網頁。但是,我需要用下劃線替換NSString中的空格,並且我還需要用「%27」替換所有的撇號。然後,我需要追加到fullURL NSString的末尾。只要它執行使NSString替換的代碼部分,什麼都不會被替換。它與原始的NSString保持一致。當我嘗試追加時,它不會追加。Objective-C:stringByReplacingOccurrencesOfStringwithString和stringByAppendingString不起作用

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變量正在從初始化不同的類,所以只是假設它已經包含信息。

有誰能告訴我爲什麼這不起作用?謝謝。

+1

我會冒險猜測他們正在按照設計工作。查看這兩個函數的規範,看看爲什麼你的代碼不起作用。 –

+0

你爲什麼不閱讀文檔? – 2012-12-08 18:18:54

回答

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

實際上返回一個字符串,你需要捕獲,所以做。

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

字符串在許多語言中是不可變的,所以方法實際上並不修改底層字符串。

+0

謝謝!我知道這是愚蠢的,而且有另一雙眼睛總是很好。 –

+0

@JoeyKleingers你應該接受它作爲答案。 –

+0

注意它不會僅僅使用它。更改屬性的弱屬性(請參閱我的答案)。 – Mario

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字符串是有道理的,你的情況。

2

首先,你的財產是一個弱財產,這很可能是錯誤的。讓它複製而不是脆弱。然後,而不是寫artName來訪問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和編譯器版本(即在你的情況下,_artistName)。因此,只寫artName不應該工作,除非你以這種方式合成它。)