segue не работает с выделением UITableViewCell, но dequeueReusableCellWithIdentifier

Я использую раскадровку с UITableView в UINavigationController. В этом UITableView используется пользовательский tableViewCell, имеющий внутренние свойства.

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

    CustomTableViewCell *cell = nil;

    if (SYSTEM_VERSION_LESS_THAN(@"6.0") ) {

        //iOS 6.0 below
        cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
    }
    else {
        //iOS 6.0 above

        cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath]; //work segue

    }

Приведенный выше код хорошо работает с push segue. Но не тогда, когда я использовал

     cell = [[CustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];   //not work segue

Я использовал этот метод распределения для сохранения данных ячейки от повторного использования ячейки.

Это просто разница в методах alloc и deque.. . Что мне не хватает?

редактировать) Я знаю, что не использовать метод dequeReusableCell плохо по причине производительности. Но количество ячеек не будет большим. Вот почему мне не нужен метод deque.

  1. «не работает» означает «не выполнять push-переход», а не сбой.

    Он показывает ячейку так же, как при использовании метода dequeReusable, за исключением значка индикатора раскрытия справа от ячейки. Значок индикатора исходит из настроек раскадровки.

    И когда я касаюсь ячейки, ячейка подсвечивается синим цветом, но переход на нажатие не выполняется.

  2. CustomTableViewCell имеет 4 свойства. Это все отличается от UITableViewCell. Пользователи устанавливают свойства в DetailViewController (переход к этому). Ячейка не имеет IBOutlet ref. В MasterViewController (с tableView) метод cellForRowAtIndexPath возвращает код CustomTableViewCell выше.

  3. Метод cellForRowAtIndexPath добавляет кнопку включения/выключения слева от индикатора в CustomTableViewCell и устанавливает номер тега для ячейки.


person bureaucoconut    schedule 22.02.2013    source источник
comment
Обратите внимание, что при использовании раскадровок dequeueReusableCellWithIdentifier всегда дает вам ячейку.   -  person Ric    schedule 23.02.2013


Ответы (1)


Использование dequeueReusableCellWithIdentifier — это то, что позволяет вам использовать ячейку-прототип. Если вы используете initWithStyle вместо dequeueReusableCellWithIdentifier, то вы этого не сделаете, и поэтому вы также потеряете все переходы, индикаторы раскрытия, другой внешний вид пользовательского интерфейса, который вы определили для этих прототипов ячеек.

Если вы полны решимости пойти по этому пути, вам придется пойти по «старой школе» (то есть делать то, что мы все делали до создания прототипов клеток) и написать свой собственный didSelectRowForIndexPath. Но если вы уже определили этот переход, скажем, вы назвали его "SelectRow", тогда ваш didSelectRowForIndexPath может выполнить это:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

    [self performSegueWithIdentifier:@"SelectRow" sender:cell];
}

Если вам нужен индикатор раскрытия, то ваша пользовательская процедура ячейки (или cellForRowAtIndexPath) должна будет установить его вручную. И если вы добавите его с

cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;

Затем вам нужно вручную обработать его:

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

    [self performSegueWithIdentifier:@"SelectAccessory" sender:cell];
}

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

person Rob    schedule 22.02.2013
comment
Спасибо. четкий и чистый ответ. И спасибо за совет. - person bureaucoconut; 23.02.2013