2012-01-02 9 views
2

まず、私の英語はすごく残念です...私は2都市間の距離を計算する予定のプログラムを作成したいと思います。たとえば、UITextFieldではパリ、2番目のUITextFieldでは2番目の「ロンドン」と書いています。そして、我々はすべての都市の経度と緯度を基にしています。この式。UITextFieldと面白いプログラム

ユーザーがUITextFieldに名前を挿入すると、私はこの.textを取得し、ベースと比較したいと思います。これを行うにはどうすればいいですか?私はこのようなプログラムを実行できます。愚か:

@interface City : UIViewController{ 

    IBOutlet UITextField *city1; 

    IBOutlet UITextField *city2; 
} 

@property (nonatomic, retain) IBOutlet UITextField *city1; 
@property (nonatomic, retain) IBOutlet UITextField *city2; 

-(void) calculate; 

@end 




#import "City.h" 

@implementation City 

@synthesize city1, city2; 

-(void) viewDidLoad 
{ 
    // to check changes in textfields i`m using NSTimer, I know it`s stupid but I haven`t learned how to make it in different way 

    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(calculate) userInfo:nil repeats:YES]; 

} 

-(void) obliczenia 
{ 
    double distance; 


    if([city1 is EqualToString:@"Paris"] && [city2 is EqualToString:@"London"]) 
    { 

     double Paris_lat = x1; 
     double Paris_lon = y1; 
     double London_lat = x2; 
     double London_lon = y2; 

     distance =...; // we know the formula for distance but this is not important for now. 
       // distance shows in some label but this is not a point of my problem. 

    } 
} 

それは動作しますが、我々はいくつかの都市を持っている。しかし、我々は千個の都市を持っている場合、コードを書くことnonsensになるとき私が始めています

を。 iPhoneプログラミング。 忍耐力に感謝してください、私を助けてください。非常に重要ですが、私は解決策を見つけることができません。

+0

http://stackoverflow.com/a/388584/413443ここでは、テキストフィールドの変更をリッスンする方法があります。 –

答えて

0

すべての国名を使用して配列を作成し、配列内の各国名を入力と比較することができます。

NSArray *countries = [NSArray arrayWithObjects:@"Berlin", @"Rom", nil]; 

    for (NSString *c in countries) { 
    if ([city1 isEqualToString:c]) { 
     //do something 
    } 
    } 
+0

これは実際に名前に関連付けられたデータを持たないため、これは役に立ちません。 –

+1

はい、最高のトリックは@PhilippeSabourinの解決策です – CarlJ

+0

私はそれがコメント: '何か'があると思います。人々は自分自身で空白を埋めることができます。 – msgambel

1

あなたはおそらく可能な都市を表示する、または自動補完、またはあなたの都市の選択を提供するために、あなたのTextViewでライブ検索を使用するピッカービューを使用したほうが良いです。

入力が制限されている場合(この例では、都市の名前がlong、lat値の場合)、ユーザーの入力をこれらの値に制限することをお勧めします。

+0

私はこれがよりよいインターフェースであることに同意します。 –

+0

ありがとう!はい、この場合、テキストフィールドはより良い解決策になります。 – Milosz

4

このガイドを見てみましょう: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/PropertyLists/AboutPropertyLists/AboutPropertyLists.html

を基本的には、これと同様に、プロパティリストにすべてのデータを置く:

<dict> 
    <key>Paris</key> 
    <dict> 
     <key>x</key> 
     <real>20.2</real> 
     <key>y</key> 
     <real>30.4</real> 
    </dict> 
... 
</dict> 

そして、このようにそれをロードします。

NSDictionary * data = [[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"NAMEOFPLIST" ofType:@"plist"]]; 
NSDictionary * paris = [data objectForKey:@"Paris"]; 
float xparis = [[paris objectForKey:@"x"] floatValue]; 
float yparis = [[paris objectForKey:@"y"] floatValue]; 

あなたの場合、次のようなことを行います:

NSDictionary * data = [[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"NAMEOFPLIST" ofType:@"plist"]]; 
NSDictionary * city1Data = [data objectForKey:city1.text]; 
NSDictionary * city2Data = [data objectForKey:city2.text]; 
if (city1Data != nil && city2Data != nil) { 
    // Do what you need... 
} 

そして、データで必要なことをしてください。

+0

ありがとう、フィリップ!私はこの解決策が私が必要と思うものだと思う。私はこれを試してみました(また、私はplistについてのすべてを理解しようとしました)は使用できませんが、(浮動小数点数)またはしか使用できません。私はそうです、そうではありませんか?そして、私たちも使用できません:double xparis = [paris objectForKey:@ "x"];しかしfloat xparis - [[paris objectForKey:@ "x"] floatValue]; – Milosz

+0

うん、私は二重のことを推測していた、右の音。あなたはそれをフロートに変換することができます。私は私の答えを編集します。 –

+0

また、コードのどこにでもparisの名前を明示的に指定していないことを理解していますか?あなたはNSDictionary * city = [data objectForKey:city1]と言うでしょう。そのnilがあるかどうかを確認します。あなたがそれが合法都市であることを知っていないならば。私もこれを追加します。 –