создание изменяемого массива, который может быть добавлен в последующие нажатия одной и той же кнопки? - PullRequest
4 голосов
/ 05 июня 2011

Общие вопросы по нубу:

(1) Как я могу создать массив NSMutable в действии buttonClicked, к которому я могу добавить больше записей при последующих нажатиях той же кнопки? Кажется, я всегда начинаю с нового массива при каждом нажатии (массив печатает только с 1 записью, которая является самым последним тегом кнопки в операторе NSLog).

У меня есть около 100 кнопок (по одной для каждого символа в моей строке, называемой «список»), сгенерированных циклом for ранее в моем коде, и каждой из них был присвоен тег. Они в виде прокрутки в поле зрения моего 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 Ответ

3 голосов
/ 06 июня 2011

Хорошо, во-первых, вы создаете массив локальной области действия, который переинициализируется при каждом вызове buttonClicked: .Переменная должна быть частью цикла инициализации класса.

Вам также будет лучше использовать 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...