Пытаетесь понять, почему мое утверждение if else не работает? - PullRequest
0 голосов
/ 18 января 2011

Я вполне уверен, что есть лучшие способы реализации того, что я пытаюсь сделать, и я просто пробую разные пути, чтобы увидеть, что лучше всего подходит для меня ... Итак, у меня есть UISegmentedController с 4 сегментами.Я дал каждому заголовок в интерфейсе Builder, и я пытаюсь сделать так, чтобы при нажатии на определенный сегмент он воспроизводил соответствующее видео.Я использую веб-просмотр, потому что ... ну, это то, что я знаю ... пока ... вот мой код:

-(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];
}

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

Ответы [ 4 ]

6 голосов
/ 18 января 2011

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

if (video = @"Shimmy")

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

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

if (video == @"Shimmy")

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

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

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

То, что вы ищете:

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

Тестирует равенство содержимого.

3 голосов
/ 18 января 2011

В Objective-C тест video == @"Shimmy" сравнивает 2 строковых объекта, тогда как video = @"Shimmy" - это присвоение.То, что вы хотите:

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

удачи

PS, и если мы говорим о лучших методах, вы можете выделить NSString, используя один из вспомогательных методов, и он будет автоматически освобожден позже,Например, вместо

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

вы можете использовать

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

по причине, не вызывайте release в конце.

1 голос
/ 18 января 2011

С video = @ "Shimmy" вы назначаете переменную video.Результатом этого присваивания является @ "Shimmy", которое оценивается как не ложное, поэтому, если условие истинно и инструкция выполнена.

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

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

if ([value isEqualToString: @ "Shimmy"]) {...}

0 голосов
/ 18 января 2011

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

Попробуйте прочитать здесь разницу между равными и == в Цели C

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...