Как передать объект в UITableCell для использования в методе «AccessoryButtonTapped ...»? - PullRequest
0 голосов
/ 21 января 2011

Я выдвигаю другой контроллер представления, когда пользователь выбирает accessoryButton, а отсутствующим компонентом является возможность передать объект моего домена вместе с ним.

Текущий хак - установить свойство «tag» наUITableCell для моего объекта и вытащить это внутри функции «accessoryButtonTapped».Если бы только это сработало:)

Мой первый вопрос - как мне передать объект, когда он мне нужен, в методе accessoryButtonTappedForRow?

Мой второй вопрос: если мой хак сработалКак я могу изгнать объект из ячейки?

Вот моя реализация "cellForRowAtIndexPath", где я устанавливаю свойство тега ячейки для моего объекта

- (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.myArray count] > 0) {
      MyClass* obj = [self.myArray objectAtIndex: [indexPath row]];

    cell.textLabel.text = @"click the accessory button for details";
    cell.tag = obj;
  }
    //other code here to finish the implementation ...
}

А вот мойРеализация «accessoryButtonTappedForRow ...», которая ничего не возвращает для тега, когда я пытался вытащить его

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
  MyClass* obj = [[tableView cellForRowAtIndexPath:indexPath] tag];
}

Все, что я пропустил, является честной игрой (я открыт для новых идей здесь)

1 Ответ

2 голосов
/ 21 января 2011

Ответ в том, что вы не должны.

В способе реализации вы используете UITableCell для хранения данных для обработки.Затем вам необходимо поддерживать согласованность между тем, что хранится в UITableCell, и тем, что хранится в self.myArray.В простой программе это не проблема, но в конечном итоге она превратится в беспорядок.

Вместо этого просто извлеките из модели (в данном случае ваш self.myArray) объект, представляющий UITableCell напрямую.Таким образом, данные всегда передаются от myArray (модель) к UITableCell (просмотр), а не наоборот.Это облегчает понимание программы в долгосрочной перспективе.

Конкретно, в ваших

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

и

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath

вы обращаетесь к модели в первоми вы пытаетесь получить доступ к представлению во втором.Не.Просто используйте

MyClass* obj = [self.myArray objectAtIndex: [indexPath row]];

в обоих методах делегата.Или лучше, я бы определил метод

-(MyClass*) objForIndexPath:(NSIndexPath*)indexPath{
     return [self.myArray objectAtIndex: [indexPath row]];
}

и использовал бы

MyClass* obj = [self objForIndexPath:indexPath];

, чтобы уменьшить повторение кодов.

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