UITextField 和有趣的程序

Posted

技术标签:

【中文标题】UITextField 和有趣的程序【英文标题】:UITextField and interesting program 【发布时间】:2012-01-02 15:25:44 【问题描述】:

首先,对不起我的英语……我想写一个程序来计算两个城市之间的距离。例如,在 UITextField 我们写巴黎,在第二个 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. 

    

它运行,但是当我们的城市很少时。但是当我们有上千个城市时,写代码就不是废话了。

我从 iPhone 编程开始。 谢谢你的耐心,请帮助我。这很重要,但我找不到解决方案。

【问题讨论】:

***.com/a/388584/413443 这是监听文本字段更改的更好方法。 【参考方案1】:

看看这个指南: 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...

然后对数据做你需要的事情。

【讨论】:

谢谢菲利普!我认为这个解决方案是我需要的。我试过这个并且(我也试图理解关于 plist 的一切)(可能)我们不能使用 而只能使用 (它是浮点数)或 。我m right,arent 我?而且我们也不能使用:double xparis = [paris objectForKey:@"x"];但是浮动 xparis - [[paris objectForKey:@"x"] floatValue]; 是的,我猜是双重的,听起来是对的。您可以通过这种方式将其转换为浮点数,是的。我将编辑我的答案。 另外,您明白您没有在代码中的任何地方专门命名巴黎,对吧?你会说 NSDictionary * city = [data objectForKey:city1];并检查它是否为零。如果它不是你知道它是一个合法的城市。这个我也加一下。【参考方案2】:

您最好使用选择器视图来显示可用城市,或者使用文本视图中的实时搜索来自动完成,或者为您的城市提供选择。

如果您有一组受限制的输入(在这种情况下,是您拥有 long、lat 值的城市名称),最好将用户的输入限制为这些值。

【讨论】:

我同意这也是一个更好的界面。 谢谢!是的,在这种情况下,文本字段将是更好的解决方案。【参考方案3】:

您可以创建一个包含所有国家/地区名称的数组,并将数组中的每个国家/地区名称与您的输入进行比较。

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

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

【讨论】:

这没有用,因为它实际上没有与名称相关联的数据。 是的,所以最好的技巧是来自@PhilippeSabourin 的解决方案 我认为这就是评论://do something 的用途。人们可以自己填空。

以上是关于UITextField 和有趣的程序的主要内容,如果未能解决你的问题,请参考以下文章

UITextField右对齐iOS 7

UITextField 键盘没有消失

切换uitextf时停止键盘关闭

touchesBegan 不触发

在不禁用上下文菜单的情况下管理 UITextfiled 上的长按?

使用 uitextfields 创建 uitableview 表单