【问题标题】:iPhone App - NSArray IssueiPhone 应用程序 - NSArray 问题
【发布时间】:2011-07-08 21:07:51
【问题描述】:

您好,我正在学习如何在 Objective-C 中编写代码。我想将视图中文本字段的值存储在一个数组中:

NSArray* answers = [NSArray arrayWithObjects:fluidIntake.text, sleepQuality.text, sleepQuantity.text, mentalRecovery.text, 
                          physicalRecovery.text, pretrainingEnergy.text, muscleSoreness.text, generalFatigue.text, nil];

这可能吗?如果没有,是否有任何更简洁的方法来存储多个文本字段值而无需将它们分配给 NSString 变量..

更新:

这是我的视图控制器中的功能:

-(IBAction)postData:(id)sender{ 
    diary = [[PersonalDiary alloc]init];

    NSArray* answers = [NSArray arrayWithObjects:fluidIntake.text, sleepQuality.text, sleepQuantity.text, mentalRecovery.text, 
                          physicalRecovery.text, pretrainingEnergy.text, muscleSoreness.text, generalFatigue.text, nil];


    [diary post:answers to:  @"http://www.abcdefg.com/test.php"];   
}

它在按下按钮时触发。它应该将输入到文本字段中的 8 个值存储在 NSArray 中,并将其传递给我的 Model 类中的一个函数,该函数会尝试打印数组中的第一个元素(即第一个文本字段值):

-(void) post:(NSArray*) ans to:(NSString*) link{
    NSLog(@"%@", ans[0]); 
}

但它没有,它只是打印:PersonalDiary[37114:207] __NSArrayI

【问题讨论】:

  • 您同时发布了更多代码;我已经删除了我的答案,因为它不再有用了。 @Joe 和@Grady Player 的回答非常好。

标签: iphone objective-c xcode nsarray


【解决方案1】:

您在此方法中错误地索引了数组并使用了错误类型的字符串。

-(void) post:(NSArray*) ans to:(NSString*) link{
    NSString* a = "Hello";
    NSLog(@"%s%d", a, ans[0]); 
}

ans[0] 将打印您的NSArray 的指针地址并且不访问您的元素。要访问您的阵列,您需要使用objectAtIndex:。所有 NSString 字面量都需要以 @ 为前缀。当您打印任何类型的 Objective-C 对象时,请使用 %@ 格式。此外,不先检查计数就访问数组的对象也是不安全的。

-(void) post:(NSArray*) ans to:(NSString*) link{
    NSString* a = @"Hello";
    NSLog(@"%@ %@", a, [ans objectAtIndex:0]); 
    //Or print entire array
    NSLog(@"%@", ans);
}

【讨论】:

    【解决方案2】:

    这是可能的。应该可以正常工作。如果不知道更多关于你在做什么,很难说更多,但去吧。

    【讨论】:

      【解决方案3】:

      这取决于您要如何处理这些存储的值。例如,您是否希望在程序的生命周期内从集合中读取它们?如果是这样,多久一次?关于您当前设计的一件事,它有效并且“高效”,但它并没有为您提供一种可维护的方式来检索您存储的所有值。举个例子,你想稍后在你的程序中更新物理恢复值,你怎么做?

      在您当前的设置中,您必须知道 physicalRecovery 位于阵列中的索引 4 处。虽然(也许)对于少量数据集合来说还可以,但这会使您的程序变得脆弱且难以维护。

      作为替代方案,我建议您使用 NSDictionary 来存储您的信息。它与数组非常相似,但您将能够通过预定义的键访问您的信息 - 极大地提高了可维护性。例如:

      在您的 .h 文件中的某处:

      extern NSString * const KEY_FLUIDINTAKE;
      extern NSString * const KEY_SLEEPQUALITY;
      extern NSString * const KEY_SLEEPQUANTITY;
      extern NSString * const KEY_MENTALRECOVERY;
      extern NSString * const KEY_PHYSICALRECOVERY;
      extern NSString * const KEY_PRETRAININGENERGY;
      extern NSString * const KEY_MUSCLESORENESS;
      extern NSString * const KEY_GENERALFATIGUE;
      

      在你的 .m 文件中:

      NSString * const KEY_FLUIDINTAKE = @"fluidIntake";
      ...
      NSString * const KEY_GENERALFATIGUE = @"generalFatigue";
      

      然后你可以像这样将你的值存储在字典中:

      NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys: 
          KEY_FLUIDINTAKE@, fluidIntake.text,
          ....
          KEY_GENERALFATIGUE, generalFatigue.text,
          nil];
      

      以后要访问这些值,您可以这样做:

      NSString * physicalRecoveryVal = (NSString *) [dict objectForKey: KEY_GENERALFATIGUE];
      

      字典的主要好处是以后您可以添加更多数据类型,而不必担心记住将它们存储在数组中的索引。

      希望有帮助!

      【讨论】:

      • 再一次,@Sergio 和我发布了类似的解决方案!哈哈。
      【解决方案4】:

      使用 NSArray 是可以的。您还可以考虑使用 NSDictionary,它允许将文本字段值与文本字段名称相关联:

       NSArray* values = [NSArray arrayWithObjects:fluidIntake.text ... nil];
       NSArray* keys = [NSArray arrayWithObjects:@"fluidIntake" ... nil];
       NSDictionary* answers = [NSDictionary dictionaryWithObjects:values forKeys:keys];
      

      那么你可以像这样检索值:

       NSString* fluidIntake = [answers objectForKey:@"fluidIntake"];
      

      【讨论】:

        【解决方案5】:

        不,这是个坏主意,如果未设置文本将返回nil,这将终止您的数组。 您应该真正使用字典(以便于调试和将来的维护),并检查以查看 someField.text==nil 的值,如果确实插入 [NSNull null]

        【讨论】:

        • 插入 [NSNull null] 来表示“空”索引有更好的选择,我建议不要这样做。
        • 和我一样,但是如果你必须表示一个 nil 值,你可以使用 NSNull。在字典中没有键会更好,但是如果您使用的是带有对象列表的数组构造函数,并且您希望索引有意义,您不能只在其中抛出可能为 nil 的值,因为它将终止数组的构造。
        【解决方案6】:

        就这么简单!

        NSArray *array = @[textfield1.text, textfield2.text, textfield3.text];
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-01-06
          • 2011-07-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多