2011-01-18 2 views
0

나는 내가하려고하는 것을 구현하는 더 좋은 방법이 있다는 것을 확신한다. 그리고 나는 가장 좋은 것이 무엇인지를보기 위해 여러 가지 방법을 시도하고있다. 그래서 나는 4 개의 세그먼트로 구성된 UISegmentedController를 가지고있다. 인터페이스 빌더에서 각각 제목을 주었고 내가하려는 것은 특정 세그먼트를 누르면 해당 비디오를 재생하는 것입니다. 나는이 사용 그래서 (비디오 = @ "흔들")로가는if else 문이 작동하지 않는 이유를 이해하려고 시도 했습니까?

-(IBAction) getVideo: (id) sender 
{ 
NSURL *videoURl; 
NSString *videoURLString; 
NSString *video; 

video = [videoChoice titleForSegmentAtIndex: 
    videoChoice.selectedSegmentIndex]; 

if (video = @"Shimmy") { 
    videoURLString = [[NSString alloc] initWithFormat: 
     @"http://www.andalee.com/iPhoneVideos/mov.MOV"]; 
} else if (video = @"Camel") { 
    videoURLString = [[NSString alloc] initWithFormat: 
     @"http://www.andalee.com"]; 
} else { 
    videoURLString = [[NSString alloc] initWithFormat: 
     @"http://www.yahoo.com"]; 
} 

videoURl = [[NSURL alloc] initWithString: videoURLString]; 
[videoView loadRequest: [NSURLRequest requestWithURL: videoURl]]; 

[videoURl release]; 
[videoURLString release]; 
} 

: 물론 그게 내가 아는 것입니다 ... 때문에이 웹보기를 사용하고 있습니다 ... 지금까지 ... 여기 내 코드입니다 비디오에 똑바로 있지만 모든 세그먼트에 대해 똑같은 ... 지금 내가 (비디오 == @ "쉬미")로 변경하면 그것은 곧 다른 것과 아무것도로 간다. 그건 그렇고 링크는 지금 기계공을 이해하는 것을 시도하는 무관하다.

+0

는 당신이 "다른 경고 플래그"와 같은'-Wall' 설정되어 있는지 확인 목적 C에 here 등호와 ==의 차이를 읽어보십시오 당신은 구축 "정적 분석기를 실행"옵션을 사용합니다. 그렇게하면 실수로'== '대신'='를 사용할 때 경고 메시지가 나타납니다. – JeremyP

답변

3

Objective-C 테스트 video == @"Shimmy"은 2 개의 문자열 개체를 비교하는 반면 video = @"Shimmy"은 할당입니다. 당신이 원하는 것은 :

if ([video isEqualToString:@"Shimmy"]) 

행운

P.S. 우리가 더 나은 관행에 대해 이야기하고 있다면, NSString을 편리한 메소드 중 하나를 사용하여 할당 할 수 있으며, 나중에 자동으로 릴리즈됩니다. 마찬가지로 대신

videoURLString = [[NSString alloc] initWithFormat: @"http://www.yahoo.com"]; 

당신은 결국 릴리스를 호출하지 않는 원인의

videoURLString = [NSString stringWithFormat: @"http://www.yahoo.com"]; 

를 사용할 수 있습니다.

6

등호 하나를 사용할 때 과제를 수행하고 있습니다. 그래서 :

if (video = @"Shimmy") 

이 성공적으로 문자열 @"Shimmy"를 가리 키도록 video을 변경할 수 알아보기 위해 테스트입니다.

명백한 동등성에 대해 두 등호 테스트를 사용합니다. 따라서 :

if (video == @"Shimmy") 

이 테스트는 비디오가 @"Shimmy"과 동일하고 동일한 지 테스트합니다. 다음은 거짓 될 것 참고 :

if ([NSMutableString stringWithString:@"Shimmy"] == @"Shimmy") 

를 첫 번째 문자열이 두 번째 문자열과 같은 문자열이 아니기 때문에. 그들은 같은 내용을 가질 수 있지만 같은 대상이 아닙니다.

은 무엇 당신이 찾고있는 것은이 콘텐츠 평등을 테스트

if ([video isEqual:@"Shimmy"]) 

.

+0

Dave 나는 if (video == @ "Shimmy")가 두 객체의 메모리 주소를 검사 할 것이라고 생각합니다. 두 메모리가 동일한 메모리 주소에있는 경우에만 true를 반환합니다. thats y는 false를 반환합니다 – Robin

+0

@robin right. 즉, 그들은 동일하지 않습니다. 그들은 같은 대상이 아닙니다. –

+0

동등 관계의 양측이 NSString 인 것을 알게되면'-isEqual : String'을 사용하면 조금 더 빠릅니다. – JeremyP

1

비디오 = @ "Shimmy"를 사용하면 변수 비디오에 할당 할 수 있습니다. 이 할당의 결과는 @ "Shimmy"이며 false가 아닌 것으로 평가되므로 조건이 true이고 명령문이 실행되면 ghe가됩니다.

== 당신은 포인터 값 비교를합니다. 이것은 드문 경우에만 trie가 될 것입니다. 정확하게 값이 정확히 같은 문자열을 가리키는 포인터 일 때입니다. 당신이 ststic @ "string"과 비교한다면 이것은 결코 사실이 아닐 것입니다.

문자열을 비교하는 함수를 사용해야합니다.

([값 isEqualToString은 "흔들"@]) 경우 {...}이

0

그럼 내가 목표 C에 대해 아무것도 몰라요,하지만 난 다른 프로그래밍 언어, 당 추측 = 그냥 일반 할당과 true를 반환하므로 if 루프는 항상 및 == 내용을 확인합니다.

+0

실제로 if = in 문을 사용할 때 (t = 47) if 내부의 표현식은 true를 반환하지만, t = 0을 사용하면 false 값인 0을 반환하므로 혼동하지 않습니다. 그것을 시도하십시오 – Robin

+0

아 예, 0이 아닌 값은 true로 평가됩니다 ... 고맙습니다. :) –

관련 문제