UISwitch и UITableViewCell iOS4 - PullRequest
       18

UISwitch и UITableViewCell iOS4

0 голосов
/ 26 августа 2010

Предостережение: я искал ответ на свой вопрос, и некоторые подошли ближе, но я все еще что-то упускаю. Вот сценарий:

Мне нужен способ динамического создания UITableViewCell s, содержащих UISwitch es во время выполнения, на основе данных в таблице (что я могу сделать). Проблема становится при подключении переключателей, так что я могу получить их значение, когда это представление изменяется (перемещены, закрыты и т. Д.). Я пытался использовать события UIControlEventValueChanged, чтобы получать уведомления, но не смог указать его правильно, потому что он сбрасывает при нажатии этого переключателя. Кроме того, кажется, нет никакого способа однозначно идентифицировать коммутатор, так что если все события обрабатываются одной подпрограммой (идеально), я не могу отличить их друг от друга.

Итак ...

Если у меня есть UITableView:

@interface RootViewController : UITableViewController 
{
    UISwitch * autoLockSwitch;
}

@property (nonatomic, retain) UISwitch * autoLockSwitch;
-(void) switchFlipState: (id) sender;
@end

// файл .m:

@implementation RootViewController
// ...


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    static NSString * CellIdentifier = @"Cell";
    int row          = 0;
    NSString * label = nil;
    TableCellDef_t  * cell_def = nil;

    row = indexPath.row;
    cell_def = &mainMenuTableCellsDef[ row ];

    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }
    label = (NSString *) mainMenuTableCellsDef[indexPath.row].text;
    [cell.textLabel setText:(NSString *) mainMenuItemStrings[ indexPath.row ]];
    if (cell_def->isSpecial)  // call special func/method to add switch et al to cell.
    {
        (*cell_def->isSpecial)(cell );  // add switch, button, etc.
    }
    else
    {
        [cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];
    }
}


and this is the 'special' function:

-(void) autoLockSpecialItem :(UITableViewCell *) cell
{
    autoLockSwitch = [[[UISwitch alloc] initWithFrame:CGRectZero] autorelease];
    [autoLockSwitch addTarget:self action:@selector(switchFlipState:) forControlEvents:UIControlEventValueChanged ];
    [cell addSubview:autoLockSwitch];
    cell.accessoryView = autoLockSwitch;
}

и наконец:

-(void) switchFlipState: (id) sender
{
    NSLog(@"FLIPPED");
}

=============================================== ===============

Вопросы:

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

  2. Я не могу поместить метод экземпляра в таблицу как указатель на функцию; и это тоже не похоже на метод класса. Если я сделаю это функцией 'C / C ++', как мне получить доступ к переменным-членам класса / экземпляра? То есть, если я хочу поместить вызов autoLockSpecialItem в статическую таблицу (или разумный факсимильный аппарат), чтобы я мог получить autoLockSwitch переменную-член? Если я сделаю это методом класса, а autoLockSwitch var - статическим, будет ли это допустимым?

  3. Проще говоря: как мне подключить UIControlEventValueChanged к моему представлению (я пробовал и потерпел неудачу), и можно ли различить во время выполнения в обработчике событий, какой переключатель изменился?

  4. Есть ли лучший способ? Я не могу поверить, что я первый человек, который должен решить эту проблему.

Извинения за длину, благодарность за внимание и благодарность за любую помощь.

: пн:

Ответы [ 2 ]

0 голосов
/ 27 августа 2010

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

Кроме того, вам, вероятно, следует добавить переключатель в представление содержимого ячеек, а не в саму ячейку, [cell.contentView addSubview:autoLockSwitch]. Также необходимо установить рамку (примечание CGRectZero, какао будет игнорировать ширину и высоту, но использует координаты x, y, чтобы определить, где вы хотите переключить ячейку.

0 голосов
/ 27 августа 2010

Не знаю, почему ваш метод не подключен, но простой способ "различить во время выполнения в обработчике событий, какой переключатель изменился" - это взять отправителя (id), данногообработчик событий, просмотрите таблицу и сравните отправителя с любыми переключателями, если они есть, в каждом элементе таблицы.Если это слишком медленно, возможна оптимизация хеш-таблицы, соединяющей отправителей с ячейками таблицы, или что-то в этом роде.

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

...