2011-01-18 11 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]; 
} 

だから、行く:まあそれは私が知っている...ので、私は今のところ...ここに私のコードです...のWebViewを使用していますビデオにまっすぐになりますが、すべてのセグメントで同じです...今私はそれを(ビデオ== @ "Shimmy"に)変更すれば、それはまっすぐに他のものに行きます。ところで、今のところリンクはメカニックを理解しようとするだけでは無関係です。

+0

は、あなたが「他の警告フラグ」として '-Wall'セットを持っていることを確認してくださいObjective Cの中でhereイコールと==の違いを読んでみて、あなたが構築する「静的解析を実行する」オプションを有効にします。そうすれば、間違って '== 'の代わりに' = 'を使うと警告が出ます。 – JeremyP

答えて

3

は、2つの文字列オブジェクトを比較します。何が欲しいのです:

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

幸運

P.S.より良い方法について話しているなら、便利な方法の1つを使用してNSStringを割り当てることができ、後で自動リリースされます。同様に代わり

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

のあなたは最終的にリリースを呼び出していない原因の

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

を使用することができます。

6

等号を1つ使用すると、割り当てが行われます。だから、:

if (video = @"Shimmy") 

これは、あなたが成功した文字列@"Shimmy"を指すようにvideoを変更することができましたかどうかを確認するテストです。

明示的な等価性のために2つの等号テストを使用する。したがって:

if (video == @"Shimmy") 

ビデオが@"Shimmy"と等しいかどうかをテストします。

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

最初の文字列が2番目の文字列と同じ文字列ではありませんので:以下はになることに注意してください。彼らは同じ内容を持っているかもしれませんが、彼らは同じ目的ではありません。

あなたが探していることは次のとおりです。

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

これは、コンテンツの平等をテストします。 video = @"Shimmy"を割り当てている間のObjective-C試験video == @"Shimmy"

+0

デイブ私は、(ビデオ== @ "Shimmy")両方のオブジェクトのメモリアドレスをチェックすると思う。そして、両方が同じメモリアドレスにある場合にのみ真を返します。それは偽を返します。 – Robin

+0

@robin right。つまり、それらは同一ではありません。彼らは同じ目的ではありません。 –

+0

等号関係の両辺がNSStringであることが分かっている場合は、 '-isEqual:'より少し速い '-isEqualToString:'を使うことができます。 – JeremyP

1

ビデオ= @ "Shimmy"では、可変ビデオへの割り当てを行います。この割り当ての結果は、@ "Shimmy"で、偽でないと評価されるため、条件が真で文が実行された場合はgheと評価されます。

==あなたはポインタ値の比較を行います。まれに、この値が正確に同じ文字列へのポインタを持つ場合にのみ、これはトライになります。これは、あなたがststic @ "string"と比較すると決して真実ではありません。

文字列を比較する関数を使用する必要があります。

([値isEqualToString: "シミー" @])場合はまあ、私はObjective Cのについては何も知らないが、私は他のプログラミング言語ごとに推測し、 =単なる代入である{...}

0

とtrueを返すので、ifループは常に返ります。 と==は内容をチェックします。

+0

実際に= if文のようにif(t = 47) if内部の式はtrueを返しますが、t = 0を使用すると0の値を返します。これはfalseなので、混乱することはありません。それを試してください – Robin

+0

ああ、ゼロ以外の値はtrueに評価されます...ありがとうRobinはそれを指摘! :) –

関連する問題