Определение UISegmentedControl, встроенного в пользовательский UITableViewCell при вызове селектора - PullRequest
1 голос
/ 13 марта 2011

У меня есть пользовательский UITableViewCell, в котором UISegmentedControl добавлен как подпредставление через свойство contentView ячейки следующим образом:

#define TABLECELL_SEGMENT_TAG 1

...


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

    UISegmentedControl *testSegmentedControl;

    // Check for a reusable cell first, use that if it exists
    UITableViewCell *tableCell = [tableView dequeueReusableCellWithIdentifier:@"OurCustomCell"];

    // If there is no reusable cell of this type, create a new one
    if (!tableCell) {
        tableCell = [[[UITableViewCell alloc] 
                      initWithStyle:UITableViewCellStyleSubtitle
                      reuseIdentifier:@"OurCustomCell"] autorelease];


        // Create our segmented control
        NSArray *segmentItems = [NSArray arrayWithObjects:@"Option 1", @"Option 2", nil];
        UISegmentedControl *testSegmentedControl = [[UISegmentedControl alloc] initWithItems:segmentItems];
        [testSegmentedControl setTag:TABLECELL_SEGMENT_TAG];
        [[tableCell contentView] addSubview:testSegmentedControl];
        [testSegmentedControl release];
    }

    // Set the selected segment status as required
    testSegmentedControl = (UISegmentedControl *)[tableCell.contentView viewWithTag:TABLECELL_SEGMENT_TAG];

    ...

    [testSegmentedControl addTarget:self
                         action:@selector(segmentedControlUpdated:)
               forControlEvents:UIControlEventValueChanged];        

    return tableCell;
}

Что мне нужно сделать, так это несколько установить селектор addTarget для каждого сегментированного элемента управления так, чтобы он идентифицировал рассматриваемую строку, очевидным решением является использование тега сегментированного элемента управления. Однако, как вы можете видеть, я уже использую тег для извлечения элемента управления из пользовательского содержимого contentView, если существующая ячейка возвращается с помощью метода dequeueReusableCellWithIdentifier: UITableView.

Как таковой, мне просто интересно, как лучше всего добиться этого? (Полагаю, я мог бы просто расширить класс UISegmentedControl для добавления свойства associatedTableRow, но мне интересно, есть ли более элегантное решение.)

Ответы [ 2 ]

5 голосов
/ 13 марта 2011

Поскольку подклассы - это всегда худший выбор, я бы исполнил танец супервизии с супервизором.

- (IBAction)controlChanged:(UIControl *)sender
    NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *)[[sender superview] superview]];
    // do something
}

поскольку iOS7 изменила иерархию представления, приведенный выше код работать не будет. Вам нужно будет использовать indexPathForRowAtPoint::

- (IBAction)controlChanged:(UIControl *)sender {
    CGPoint senderOriginInTableView = [sender convertPoint:CGPointZero toView:self.tableView];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:senderOriginInTableView];
    // do something
}
4 голосов
/ 13 марта 2011

Создайте подкласс UITableViewCell, который имеет ссылку на UISegmentedControl как свойство, и создайте его экземпляр вместо UITableViewCell. Тогда вам не нужен тег для ссылки на сегментированный элемент управления, и вы можете использовать его для хранения номера строки.

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

...