Предостережение: я искал ответ на свой вопрос, и некоторые подошли ближе, но я все еще что-то упускаю. Вот сценарий:
Мне нужен способ динамического создания 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");
}
=============================================== ===============
Вопросы:
Почему это произошло (плохой селектор), когда переключатель был нажат? Я считаю, что мой код соответствует всему примеру кода, который я видел, но, очевидно, что-то не так.
Я не могу поместить метод экземпляра в таблицу как указатель на функцию; и это тоже не похоже на метод класса. Если я сделаю это функцией 'C / C ++', как мне получить доступ к переменным-членам класса / экземпляра? То есть, если я хочу поместить вызов autoLockSpecialItem
в статическую таблицу (или разумный факсимильный аппарат), чтобы я мог получить autoLockSwitch
переменную-член? Если я сделаю это методом класса, а autoLockSwitch
var - статическим, будет ли это допустимым?
Проще говоря: как мне подключить UIControlEventValueChanged
к моему представлению (я пробовал и потерпел неудачу), и можно ли различить во время выполнения в обработчике событий, какой переключатель изменился?
Есть ли лучший способ? Я не могу поверить, что я первый человек, который должен решить эту проблему.
Извинения за длину, благодарность за внимание и благодарность за любую помощь.
: пн: