2017-01-22 5 views
0

У меня есть 11 или более строк. Необходимо создать UISwitch только в первой ячейке. UIswitch дублируется, когда я нажимаю на любую строку.Создайте UISwitch в одной ячейке таблицы - UISwitch получает дубликаты

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:EN_MoreTableViewCell]; 
if (cell == nil) { 
    cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:EN_MoreTableViewCell]; 
    cell.backgroundColor = [UIColor clearColor]; 
} 
cell.textLabel.text = languageObject.name; 
[cell.textLabel setFont:font]; 
if (indexPath.row == 0 && [languageObject.name isEqual: @"All Languages"]) { 
    if (!mySwitch) { 
     mySwitch = [[UISwitch alloc] initWithFrame:CGRectMake(_languageListTableView.frame.size.width - 60, 0, 40, 40)]; 
     [cell.contentView addSubview:mySwitch]; 
    } 
    cell.accessoryType = UITableViewCellAccessoryNone; 
} 
else { //other cell code// 

} 

Просьба помочь.

+0

Пожалуйста, форматировать Ваш код. – shallowThought

+0

Наиболее удобным способом является создание двух отдельных ячеек таблицы в Interface Builder. – vadian

ответ

1

Либо:

Создайте два прототипа клеток в раскадровку, один с и один без UISwitch и первым из очереди, только если indexPath.row == 0.

Или:

Добавьте UISwitch в камеру в раскадровку, сделать IBOutlet в камеру и установить self.mySwitch.isHidden = true в клетках prepareForReuse().

Таким образом, состояние по умолчанию при повторном использовании ячейки со скрытым переключателем.

Позже, если indexPath.row == 0, комплект cell.mySwitch.isHidden = false.

1

Это классический вопрос новичка iOS. Это смущает ад из большинства из нас, когда мы сначала используем табличные представления (это, конечно, сначала меня путало.)

Клетки создаются один раз, а затем повторно используются снова и снова. Функция dequeueReusableCellWithIdentifier() возвращает возвращенную ячейку, если она доступна, или создает новый из прототипа вашей соты, если нет.

Если вы получаете переработанную ячейку, у нее уже будет установлен ваш переключатель.

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

Переработанная ячейка может также содержать значения в ней другие поля (Как если бы вы установили поле метки, чтобы содержать строку, оно все равно будет содержать строку.) Вам нужно очистить старые значения и полностью сконфигурировать переработанную ячейку. (Пользовательский класс ячеек и прототип не исправляют эту проблему. Вам всегда нужно полностью настраивать каждое поле в своей ячейке.)

0

Иногда пользовательская ячейка представляет собой большой молоток, который просто добавляет один вид в совершенно отличный стандарт UITableViewCell. Для этих случаев ленивое создание - это хороший шаблон, который позволяет получить возведенные виды точно один раз на повторно используемых ячейках (или даже в любом подзапросе любого вида). Он работает следующим образом:

// in your cellForRowAtIndexPath, after dequeuing cell 
UISwitch *switch = (UISwitch *)[cell viewWithTag:64]; // make up a unique tag 
if (!switch) { 
    switch = [[UISwitch alloc] initWithFrame:...]; 
    switch.tag = 64; // 64 must match the tag above 
    [cell addSubview:switch]; 
} 
// here, switch is always valid, but only created when it was absent 
0

Добавить UISwitch в раскадровке. Подключите розетку. В cellforrowatindexpath tableview, если индекс равен 0, set hidden = false else set hidden = true. Надеюсь, это сработает.

0

Вы просто скрыть переключатель, где вы не хотите, чтобы отобразить и настроить действие для этого переключателя динамически для конкретного indexpath вы хотите

Смежные вопросы