2011-01-18 3 views
0

Я уверен, что есть лучшие способы реализации того, что я пытаюсь сделать, и я просто пытаюсь разными способами увидеть, что лучше всего подходит для меня ... Итак, у меня есть UISegmentedController с 4 сегментами. Я дал каждому название в интерфейсе Builder, и я пытаюсь сделать это, когда они нажимают определенный сегмент, он будет воспроизводить соответствующее видео. Я использую WebView, потому что ... ну, что это то, что я знаю ... до сих пор ... вот мой код:Попытка понять, почему мое заявление 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]; 
} 

Так что, когда я использую это (видео = @ «шимми») он идет прямо на видео, но то же самое для каждого сегмента ... теперь, если я изменю его на (видео == @ «Shimmy»), он идет прямо к другому, и ничего ... еще. Кстати, ссылки прямо сейчас не имеют значения, просто пытаясь понять механику.

+0

Убедитесь, что вы '-Wall' набор в качестве«другой флаг предупреждения»и включить в«Run статического анализатора»построить вариант. Таким образом, вы получите предупреждение, когда случайно используете '=' вместо '=='. – 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") 

Это тестирование, чтобы увидеть, если вы были в состоянии успешно изменить video, чтобы указать на строку @"Shimmy".

Использование двух равных знаков для явного равенства. Итак:

if (video == @"Shimmy") 

Это тесты, чтобы увидеть, если видео равны и идентичны @"Shimmy". Обратите внимание, что следующие будут ложные:

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

Поскольку первая строка не та же строка в качестве второй строки. Они могут иметь одинаковый контент, но они не являются одним и тем же объектом.

Что вы ищете это:

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

Это проверяет равенство содержимого.

+0

Dave Я думаю, что если (видео == @ "Shimmy") проверит адрес памяти обоих объектов. И он вернет true, только если оба находятся на одном адресе памяти. thats y он вернет false – Robin

+0

@robin right. Другими словами, они не идентичны. Это не тот же объект. –

+0

Когда вы знаете, что обе стороны отношения равенства являются NSStrings, вы можете использовать '-isEqualToString:', который немного быстрее, чем '-isEqual:' – JeremyP

1

С видео = @ "Shimmy" вы назначаете переменное видео. Результатом этого назначения является @ «Shimmy», который оценивается как не false, поэтому ghe, если условие истинно и выполняется оператор.

С помощью == вы делаете сравнение значений указателя. Это будет только в редких случаях - точно, когда значение имеет указатель на точно такую ​​же строку. Это никогда не будет правдой, если вы сравните с ststic @ "string".

вам нужно использовать функцию для сравнения строк, например.

если ([значение isEqualToString: @ "шимми"]) {...}

0

Ну я не знаю ничего о Objective C, но я предполагаю, что в соответствии с другими языками программирования, = это просто назначение и вернет true и, следовательно, цикл if всегда будет оцениваться, и == проверяет содержимое.

Попробуйте читать вверх here разницу между равными и == в Objective C

+0

Фактически, когда вы используете = в выражении if, как это, если (t = 47) то выражение внутри if вернет 47, что верно, но если вы используете t = 0, то оно вернет 0 значение, которое является ложным, поэтому не путайте. Попробуйте – Robin

+0

Ahhh да, любое ненулевое значение оценивается как истина ... Спасибо Робин за то, что указали это !!! :) –

Смежные вопросы