Как передать значение int на UIButton click внутри UITableView - PullRequest
0 голосов
/ 31 декабря 2010

Итак, у меня есть контроллер представления с одним UITableView, который показывает строку пользователю.Но мне нужен был способ, чтобы пользователь выбирал этот объект по идентификатору с помощью обычного UIButton, поэтому я добавил его в качестве подпредставления, и событие щелчка работает, как и ожидалось.

Проблема заключается в следующем - как я могу передать intзначение этого события клика?Я пытался использовать атрибуты кнопки, такие как button.tag или button.accessibilityhint без особого успеха.Как профессионалы передают значение типа int следующим образом?

Также важно, чтобы я мог получить фактическое значение [x intValue] из int позже в этом процессе.Некоторое время назад я думал, что смогу сделать это с помощью простого

NSLog (@ "фактически выбранная шляпа была% d", [obj.idValue intValue]);

Но это не таккажется, работает (любая идея, как я могу получить фактическое значение int непосредственно из переменной?).

У меня есть рабочий код ниже

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

  if ([self.hats count] > 0) {
      Hat* obj = [self.hats objectAtIndex: [indexPath row]];

    NSMutableString* fullName = [[NSMutableString alloc] init];
    [fullName appendFormat:@"%@", obj.name];
    [fullName appendFormat:@" %@", obj.type];

    cell.textLabel.text = fullName;
    cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;

    //add the button to subview hack
    UIButton* button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    button.frame = CGRectMake(50, 5, 50, 25);
    [button setTitle:@"Select" forState:UIControlStateNormal];
    button.backgroundColor = [UIColor clearColor];
    button.adjustsImageWhenHighlighted = YES;

    button.tag = obj.idValue; //this is my current hack to add the id but no dice :(

    [button addTarget:self action:@selector(action:) forControlEvents:UIControlEventTouchUpInside];

    [cell.contentView addSubview:button];
    //hack
  }

    return cell;  
}

- (void)action:(id)sender {
  int* hatId = ((UIButton *)sender).tag; //try to pull the id value I added above ...

  //do something w/ the hatId 
}

Ответы [ 3 ]

2 голосов
/ 31 декабря 2010
NSInteger hatId = ((UIButton *)sender).tag;
1 голос
/ 31 декабря 2010

Я бы сказал об этом совершенно по-другому. Я хотел бы иметь NSMutableDictionary, который содержит объекты кнопки с тегом в качестве ключей. Вероятно, в источнике данных таблицы. Затем, когда что-нибудь случится с этой кнопкой или тегом, вы можете легко добраться до одного или другого. Затем, когда вам нужен тег для данной кнопки, вы можете использовать метод allKeysForObject в словаре, который, вероятно, только один на объект. Если вам нужна кнопка для тега, вы можете использовать тег в качестве значения ключа для получения указателя кнопки. При этом предполагается, что значения тегов не используются повторно и являются уникальными (если они есть, их нужно удалить из словаря, когда кнопки исчезнут).

В качестве альтернативы вы также можете создать подкласс UIButton и более правильно сохранить значение тега. Я думаю, что идеалист сказал бы вам, что это ответ, насколько вы пытаетесь заставить его работать со своим взломом. =)

Надеюсь, это поможет некоторым.

0 голосов
/ 08 января 2011

Окончательное решение состояло из нескольких изменений:

1.) Вместо использования типа int я переключился на NSNumber (благодаря нескольким сделанным комментариям), а также обнаружил, что int является большей проблемойкогда дело доходит до управления памятью, потому что я новичок: (

2.) Вместо установки тега в качестве идентификатора я использовал некоторые концепции, упомянутые в комментариях, и выдвинул весь объект, чтобы получить более подробную информацию об этом, когдаЯ вытащил его из действия позже.

Вот пересмотренный метод, где я устанавливаю объект

  if ([self.hats count] > 0) {
      Hat* obj = [self.hats objectAtIndex: [indexPath row]];

    NSMutableString* fullName = [[NSMutableString alloc] init];
    [fullName appendFormat:@"%@", obj.name];
    [fullName appendFormat:@" %@", obj.type];

    cell.textLabel.text = fullName;
    cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;

    //add the button to subview hack
    UIButton* button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    button.frame = CGRectMake(50, 5, 50, 25);
    [button setTitle:@"Select" forState:UIControlStateNormal];
    button.backgroundColor = [UIColor clearColor];
    button.adjustsImageWhenHighlighted = YES;

    button.tag = obj;

    [button addTarget:self action:@selector(action:) forControlEvents:UIControlEventTouchUpInside];

    [cell.contentView addSubview:button];
    //hack
  }

    return cell;  
}

А вот пересмотренное действие, где я вытаскиваю объект, затем любое свойство, которое я хочу

- (void)action:(id)sender {
  Hat* obj = ((UIButton *)sender).tag;
  NSNumber* hatId = obj.idValue;
  //then if I wanted the actual value of hatId I could do
  NSLog(@"print the hatId out as is %d", [hatId intValue]);
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...