segue не работи с UITableViewCell alloc, но 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.. какво ми липсва

edit) Знам, че неизползването на метода dequeReusableCell е лошо поради причината за производителността. Но броят на клетките няма да е много. Ето защо не се нуждая от метода deque.

  1. "не работи" означава "не изпълнявайте push segue", а не срив.

    Показва клетката по същия начин, както при използването на метода dequeReusable, с изключение на иконата на индикатора за разкриване вдясно на клетката. Иконата на индикатора идва от настройката на сценария.

    И когато докосна клетката, клетката се осветява в синьо, но натискането не се изпълнява.

  2. CustomTableViewCell има 4 свойства. Всичко това е различно от UITableViewCell. Потребителите задават свойствата в DetailViewController (push segue води до това). Клетката няма IBOutlet ref. В MasterViewController (имащ tableView), методът cellForRowAtIndexPath връща CustomTableViewCell по-горе код.

  3. Методът cellForRowAtIndexPath добавя бутон за включване/изключване отляво на индикатора на CustomTableViewCell и задава номер на етикет за клетката.


person bureaucoconut    schedule 22.02.2013    source източник
comment
Имайте предвид, че когато използвате Storyboards, 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