2012-12-08 2 views
0

Xcode의 웹보기에서 웹 페이지를로드하는 데 사용하려고하는 NSString이 있습니다. 그러나 NSString의 공백을 밑줄로 바꿔야하고 모든 아포스트로피를 "% 27"으로 바꿔야합니다. 그런 다음 fullURL NSString의 끝에 추가해야합니다. NSString 대체를 만드는 코드 부분을 실행할 때마다 아무것도 대체되지 않습니다. 그것은 원래의 NSString과 동일하게 유지됩니다. 추가하려고하면 추가되지 않습니다.Objective-C : stringByReplacingOccurrencesOfStringwithString 및 stringByAppendingString이 작동하지 않습니다.

.H 파일 다음는 NSString 치환술

@interface WikipediaViewController : UIViewController 

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

@end 

방법 및 그것에 추가 :

- (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 변수 A로부터 초기화되고

다른 클래스, 그래서 그것은 이미 정보가 들어 있다고 가정합니다.

아무도 왜 이것이 작동하지 않는지 말할 수 있습니까? 감사.

+1

정확하게 설계된대로 작동하고 있다고 생각하면 위험 할 수 있습니다. 두 함수의 스펙을보고 코드가 작동하지 않는 이유를 확인하십시오. –

+0

설명서를 읽지 않는 이유는 무엇입니까? –

답변

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

첫째, 귀하의 재산은 약한 재산이며, 대부분 잘못되었을 수 있습니다. 약한 대신 복사본으로 만듭니다. 그런 다음, 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; 

(코드 때문에 재산이 자동으로 밑줄 - 접두사 IVAR을 가지고 합성한다 최신 엑스 코드 및 컴파일러 버전으로 처음에 왜 작동하는지 궁금 (즉, 귀하의 경우에는 _artistName). 그런 식으로 합성하지 않는 한 artistName 만 쓰는 것은 효과가 없습니다.)

관련 문제