Ios 如何在iphone中单击按钮时将文本字段/标签中的值添加到数组中

Ios 如何在iphone中单击按钮时将文本字段/标签中的值添加到数组中,ios,xcode,ipad,nsmutablearray,nsarray,Ios,Xcode,Ipad,Nsmutablearray,Nsarray,我有一个文本字段,用户可以输入1-10之间的值 在文本字段的底部有一个按钮 当用户单击“完成”按钮时,我需要将文本字段中的值添加到数组中 为此,我编写了这样的代码 - (void)viewDidLoad { [super viewDidLoad]; PainlevelsArray = [[NSMutableArray alloc] init]; //PainlevelsArray declared in .h } -(IBAction)doneClick:(id)sende

我有一个文本字段,用户可以输入1-10之间的值

在文本字段的底部有一个按钮

当用户单击“完成”按钮时,我需要将文本字段中的值添加到数组中

为此,我编写了这样的代码

- (void)viewDidLoad
{
    [super viewDidLoad];
    PainlevelsArray = [[NSMutableArray alloc] init]; //PainlevelsArray declared in .h

}


-(IBAction)doneClick:(id)sender
{
    [PainlevelsArray addObject:txtField.text ];

    // [PainlevelsArray insertObject:rateLabel.text atIndex:0 ];
    NSLog(@"PainlevelsArray *** %@",PainlevelsArray);

   [self.navigationController popToRootViewControllerAnimated:YES];

}
但每次数组只在单击按钮时在日志中显示最近添加的一个值,如下所示

2012-05-07 10:11:27.984 ESPT[796:10d03] PainlevelsArray *** (
        4,
        5,
        2,
        6,
        8,
    )
控制台上的输出

========================

2012-05-07 10:11:15.689 ESPT[796:10d03] PainlevelsArray *** (
    2
)
2012-05-07 10:11:27.984 ESPT[796:10d03] PainlevelsArray *** (
    4
)
每次加载视图时,我的数组都会变空,并在单击按钮时添加一个新条目
但我需要像这样

2012-05-07 10:11:27.984 ESPT[796:10d03] PainlevelsArray *** (
        4,
        5,
        2,
        6,
        8,
    )
所有输入的值都被添加/插入到现有数组中

提前谢谢

在练习开始视频控制器中

-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
 ExerciseResult *result = [[ExerciseResult alloc] init];
            [self.navigationController pushViewController:result animated:YES];
            [result release];
    }
- (void)viewDidLoad
{
    [super viewDidLoad];
    PainlevelsArray = [[NSMutableArray alloc] init]; //PainlevelsArray declared in .h

}


-(IBAction)doneClick:(id)sender
{
    [PainlevelsArray addObject:txtField.text ];

    // [PainlevelsArray insertObject:rateLabel.text atIndex:0 ];
    NSLog(@"PainlevelsArray *** %@",PainlevelsArray);

   [self.navigationController popToRootViewControllerAnimated:YES];

}
在当前/练习结果视图控制器中

-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
 ExerciseResult *result = [[ExerciseResult alloc] init];
            [self.navigationController pushViewController:result animated:YES];
            [result release];
    }
- (void)viewDidLoad
{
    [super viewDidLoad];
    PainlevelsArray = [[NSMutableArray alloc] init]; //PainlevelsArray declared in .h

}


-(IBAction)doneClick:(id)sender
{
    [PainlevelsArray addObject:txtField.text ];

    // [PainlevelsArray insertObject:rateLabel.text atIndex:0 ];
    NSLog(@"PainlevelsArray *** %@",PainlevelsArray);

   [self.navigationController popToRootViewControllerAnimated:YES];

}

当您单击“只需编写并添加这一行”时,就可以使用这一行代码

[array addobject:textfield.text];
只使用这个

[PainlevelsArray addObject:txtField.text]

您需要全局地声明和初始化PainlevelsArray,即在AppDelegate或单独的共享实例类中,内存已分配一次,即使您多次访问所述类,它也不会重写其数据,因此它将不断向数组中插入新值,您将获得所需的结果。

在这种情况下,您应该使用数组的属性

@property (nonatomic, strong) NSMutableArray *painlevelsArray;
初始化数组

NSMutableArray *array = [[NSMutableArray alloc] init];
self.painlevelsArray = array;
然后在每次单击按钮后将字符串添加到数组中

[self.painlevelsArray addObject:[NSString stringWithFormat:@"%@",self.textField.text]];
我认为你可能会在你的行动中放弃这种类型的代码,因为你来到了这个视图。相反,您必须休耕以作为全局ExerciseResult*结果

in.h

英寸

在你的行动方法中,你将休耕

[self.navigationController pushViewController:result animated:YES];
你会像那样跟着的


我希望它能帮助您使用全局数组

最好的解决方案是在AppDelegate.h文件中声明一个数组,并在ApplicationIDFinishLaunch方法中alloc init该数组

AppDelegate *app =  (AppDelegate*)[[UIApplication sharedApplication] delegate];
[app.arrMutable addObject:textField.text ]; 
使用用户默认值:这些默认值用于以键值格式保存应用程序数据。存储为userdefaults的值/对象始终保留在应用程序中,直到您尚未将其从沙箱中删除为止。您可以使用以下代码在userdefaults中存储数组

[[NSUserDefaults standardUserDefaults] setObject:app.arrMutable forKey:@"Global_Array_Key"];
在AppDelegae ApplicationIDFinishLuanch方法中,可以使用以下命令从userdefaults检索此数组:

self.arrMutable = [[NSMutableArray alloc]initWithArray:[[NSUserDefaults standardUserDefaults]objectForKey:@"Global_Array_Key"]];

在Delegate.h页面中声明

  @interface AppDelegate : NSObject <UIApplicationDelegate>
  {
       NSMutableArray *commString;
  }
  @property (nonatomic, retain) NSMutableArray *commString;
  @end
在您的按钮视图中

 -(IBAction)doneClick:(id)sender
{
NSMutableArray *mut=[[NSMutableArray alloc] initWithObjects:txtField.text,nil];
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
appDelegate.commString=mut;

   // some code....
}
在你想要数组的地方声明这段代码,你可以很容易地得到你的数组

   AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
   NSLog(@"commString=%@",appDelegate.commString);


如果希望在每个条目后弹出视图控制器,然后,他需要将数据存储在以前的视图控制器中。如果这对您有帮助,请将其标记为正确,以便对其他人也有帮助。我不明白您在说什么。我是说,Ranga在那里安装popToRootViewController可能是有原因的,并且此解决方案可能无法按预期工作。不,这不是问题所在原因。请描述您的视图控制器。请参见编辑问题中我描述的视图控制器OK我在caht列表中,但您不可见请参见下面我发布的答案……或者,他可以在关闭前一个视图控制器时将值传回前一个视图控制器(可能通过委派)。它不一定必须是全局变量…全局实例将是最佳实践,而不是set delegate,并使代码变得不必要的复杂。如果每次应用程序启动时都声明全局数组启动,则是的。在这种情况下,每次加载视图时阵列都会启动。这两种情况下,数组都以空数组开始。不,全局声明的数组将保持为空,直到第一次调用所述视图为止。之后,每次它都会将文本字段中的值插入其中。然而,如果数组在所述视图加载时启动,它将始终保持为空,并且不会连续地添加到先前存储的值列表中。这并不完全相同。他需要使用属性来管理此阵列。我不确定他使用了多少视图控制器。他应该在主视图控制器中初始化数组,并使用按钮将其传递给视图控制器,以向其添加对象。我们丢失了太多的代码,我无法正确回答。是的,先生,这是所有这些中最好的ans,但当应用程序启动时,数组再次变为空/重新加载为新。(而不是视图加载)如果您想在应用程序重新启动后访问同一个数组,您可以使用NSUserDefaults。如果您可以使用此代码,请接受此问题并增加您的分数。谢谢
   AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
   NSLog(@"commString=%@",appDelegate.commString);