创建一个Mutable数组,可以在以后点击同一个按钮时添加它?

时间:2011-06-05 05:32:18

标签: iphone objective-c arrays ipad nsmutablearray

一般菜鸟问题:

(1)如何在NSMutable操作中创建buttonClicked数组,以便在后续点击同一按钮时添加更多条目?我似乎总是在每次点击时重新开始一个新数组(数组只打印一个条目,这是NSLog语句中最新的按钮标记。)

我的代码中有一个for循环生成的大约100个按钮(我的字符串中每个字符一个称为“list”),每个按钮都分配了一个标记。它们位于我ViewController视图内的滚动视图中。

我希望跟踪点击了多少(以及哪些)按钮,并选择如果再次点击这些条目,则删除这些条目

这是我到目前为止所做的:

-(void) buttonClicked:(UIButton *)sender
      NSMutableArray * theseButtonsHaveBeenClicked = [[NSMutableArray alloc] initWithCapacity: list.length];
      NSNumber *sendNum = [NSNumber numberWithInt:sender.tag];
      [theseButtonsHaveBeenClicked addObject:sendNum at index:sender.tag];
      NSLog(@"%@",theseButtonsHaveBeenClicked);
}

(2)我已经读过我可以使用plist字典,但我真的不明白我将如何在代码中实现这一点,因为我无法手动输入字典中的项目(因为我没有知道用户将点击哪些按钮)。如果我以某种方式加载并替换plist文件中的字典,这会更容易吗?我该怎么做?

(3)我也不知道我应该如何管理内存,因为我需要不断更新数组。 autorelease

感谢您提供的任何帮助!

1 个答案:

答案 0 :(得分:3)

好的,首先你要创建一个本地范围的数组,每次调用 buttonClicked:时都会重新初始化。该变量应该是类init循环的一部分。

使用 NSMutableDictionary 而不是NSMutableArray也会更好。使用字典我们不必指定容量,我们可以使用按钮的标签作为字典键。

以下是您需要做的事情,这三个步骤总是在一起: property / synthesize / release 。一个值得记住的好人。

  //Add property declaration to .h file
  @property (nonatomic, retain) NSMutableDictionary * theseButtonsHaveBeenClicked;

  //Add the synthesize directive to the top of .m file
  @synthesize theseButtonsHaveBeenClicked;

  // Add release call to the dealloc method at the bottom of .m file
  - (void) dealloc {
    self.theseButtonsHaveBeenClicked = nil; // syntactically equiv to [theseButtonsHaveBeenClicked release] but also nulls the pointer
    [super dealloc];
  }

接下来,我们在初始化类实例时创建一个存储对象。将其添加到您班级的 init viewDidLoad 方法。

 self.theseButtonsHaveBeenClicked = [[NSMutableDictionary alloc] dictionary]; // convenience method for creating a dictionary

您更新的 buttonClicked:方法应该更像这样。

    -(void) buttonClicked:(UIButton *)sender {

         NSNumber *senderTagAsNum = [NSNumber numberWithInt:sender.tag];
         NSString *senderTagAsString = [[NSString alloc] initWithFormat:@"%@",senderTagAsNum];

         // this block adds to dict on first click, removes if already in dict
         if(![self.theseButtonsHaveBeenClicked objectForKey:senderTagAsString]) {
           [self.theseButtonsHaveBeenClicked setValue:senderTagAsNum forKey:senderTagAsString];
         } else {
           [self.theseButtonsHaveBeenClicked removeObjectForKey:senderTagAsString];                }
         [senderTagAsString release];
         NSLog(@"%@", self.theseButtonsHaveBeenClicked);
}