Обработка нескольких UISwitch управляет в табличном представлении, не используя свойство тегов

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

Однако я - готовое использование свойства тегов для чего-то еще, а именно, для нахождения правильного управления в ячейке в cellForRowAtIndexPath с viewWithTag! (Существует несколько вещей, которые я должен установить в каждой ячейке.)

Так, я думаю вдоль правильных строк здесь? Я чувствую, что скорее ограничен в том, как я узнаю точно, какой UISwitch изменил свое значение, таким образом, я могу сделать что-то полезное с ним.

6
задан Thaurin 1 April 2010 в 10:34
поделиться

2 ответа

Я исправил это, создав подкласс UISwitch следующим образом:

@interface NamedUISwitch : UISwitch {
NSString *name;

}

Это выглядит элегантно (массивы индексов не требуются), а свойство tag может делать все, что захочет.

Я читал, что вы должны быть осторожны с подклассами в Objective-C, хотя ...

5
ответ дан 17 December 2019 в 02:26
поделиться

Вы близки к своему подходу. В аналогичных ситуациях я создал отдельные подклассы UITableViewCell, установил тег UISwitch как index.row пути индекса и использовал этот подкласс UITableViewCell только в определенном разделе представления таблицы. Это позволяет вам использовать тег ячейки, чтобы однозначно определить, какая ячейка имеет событие, без сохранения отдельного списка индексов (как это похоже на то, что вы делаете).

Поскольку тип ячейки уникален, вы можете легко получить доступ к другим элементам ячейки, создав методы / свойства в подклассе UITableViewCell.

Например:

@interface TableViewToggleCell : UITableViewCell {
    IBOutlet UILabel *toggleNameLabel;
    IBOutlet UILabel *detailedTextLabel;
    IBOutlet UISwitch *toggle;
    NSNumber *value;
    id owner;
}

@property (nonatomic, retain) UILabel *toggleNameLabel;
@property (nonatomic, retain) UILabel *detailedTextLabel;
@property (nonatomic, retain) UISwitch *toggle;
@property (nonatomic, retain) id owner;

-(void) setLable:(NSString*)aString;
-(void) setValue:(NSNumber*)aNum;
-(NSNumber*)value;
-(void) setTagOnToggle:(NSInteger)aTag;

-(IBAction)toggleValue:(id)sender;

@end

In:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // ... prior iniitalization code for creating cell is assumed
toggleCell.owner = self;
[toggleCell setLable:@"some string value"];
[toggleCell setTagOnToggle:indexPath.row];
toggleCell.owner = self;
return toggleCell;
   //...  handle cell set up for other cell types as needed
}

Владелец является делегатом ячейки и может затем использоваться для инициирования действий в вашем контроллере. Убедитесь, что вы подключили свой UISwitch к действию toggleValue, чтобы вы могли инициировать действия в делегате, когда UISwitch изменяет состояние:

-(IBAction)toggleValue:(id)sender;
{
    BOOL oldValue = [value boolValue];
    [value release];
    value = [[NSNumber numberWithBool:!oldValue] retain];
    [owner performSelector:@selector(someAction:) withObject:toggle];
}

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

0
ответ дан 17 December 2019 в 02:26
поделиться