2015-12-21 6 views
3

Я использую UISwitch в PFTableView. Когда я включаю один UISwitch, он запускает другой переключатель в другой ячейке. Вот код для PFTableViewCell.UISwtich запускает другое событие UISwitch в UITableView

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath, object: PFObject ?) - > PFTableViewCell { 
    var cell = tableView.dequeueReusableCellWithIdentifier("tempHsCell") as!NearestHsCell! 

    if cell == nil { 
     cell = NearestHsCell(style: UITableViewCellStyle.Default, reuseIdentifier: "tempHsCell") 
    } 
    /*Assign Object to cell*/ 
    cell.hotspot = object 
    return cell 
} 

// Code for UISwtich Action 
@ 
IBAction func userSelectHotspot(sender: UISwitch) { 
    if hotspotSwitch.on { 
    selectedHotspot[(self._hotspot ? .objectId) !] = self._hotspot 
    } else { 
    let key = self._hotspot!.objectId! 
     selectedHotspot.removeValueForKey(key) 
    } 
} 

Output of tableView

+0

вы должны контролировать свой переключатель, сохраняя свое состояние переключателя в объект ячейки вместо давая ему по умолчанию, то 'dequeueReusableCellWithIdentifier' вещи перекрывают свой некоммерческий кодированный переключатель, там может быть другой способ сделать, но им не уверен: D – Tj3n

+0

Включены ли оба переключателя на экране, когда это происходит, или вам нужно прокрутить, чтобы обнаружить неисправный переключатель? Если это так, это из-за повторного использования клеток, как говорили другие. Вы должны каждый раз переустанавливать ячейки в чистое состояние. В идеале, присваивание свойства 'hotspot' может позаботиться об обновлении состояния ячейки с помощью наблюдателя свойств. –

+0

@NicolasMiari Мне нужно прокрутить вниз, чтобы посмотреть второй переключатель. Но код находится в IBAction. Можете ли вы прокомментировать свой ответ в коде. –

ответ

1

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

+0

Я не думаю, что это могло быть решением. –

+0

привет @ Майкл. Можете ли вы показать, как я могу достичь этого в коде. –

1
//need to maintain Switch status of every cell , using datasource , initially datasource initialize with all elements "NO" 

override func tableView(tableView: UITableView, cellForRowAtIndexPathindexPath: NSIndexPath, object: PFObject ?) - > PFTableViewCell { 
var cell = tableView.dequeueReusableCellWithIdentifier("tempHsCell") as!NearestHsCell! 

if cell == nil { 
    cell = NearestHsCell(style: UITableViewCellStyle.Default, reuseIdentifier: "tempHsCell") 
} 
/*Assign Object to cell*/ 

if arrDatasource.objectAtIndex(indexPath.row) as! String == "YES" { 
    switch.on = true 
} else { 
    switch.on = false 
} 
cell.hotspot = object 
switch.tag = indexpath.row 
return cell 
} 

@IBAction func userSelectHotspot(sender: UISwitch) { 
    if hotspotSwitch.on { 
    arrDatasource.setObject("YES", atIndexedSubscript:sender.tag) 
    selectedHotspot[(self._hotspot ? .objectId) !] = self._hotspot 
} else { 
    arrDatasource.setObject("NO", atIndexedSubscript:sender.tag) 
    let key = self._hotspot!.objectId! 
    selectedHotspot.removeValueForKey(key) 
} 
} 
1

Таким образом, в соответствии с вашим комментарием:

@NicolasMiari Я должен прокрутить вниз для просмотра второго switch.But код в IBAction.Can пожалуйста разработать свой ответ в коде. - Nishant Dongare

... кажется, что ячейка повторное использования, и поэтому переключатель остается «на» с тех пор, когда клетка была использована для отображения строки с индексом # 0, и вы постучали.

Чтобы избежать какого-либо предыдущего состояния сохраняться при повторном использовании ячейки, вы всегда должны сбросить его перед повторным использованием:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath, object: PFObject ?) - > PFTableViewCell { 
    var cell = tableView.dequeueReusableCellWithIdentifier("tempHsCell") as!NearestHsCell! 

    if cell == nil { 
     // Cell is brand new, no need to clean up: 

     cell = NearestHsCell(style: UITableViewCellStyle.Default, reuseIdentifier: "tempHsCell") 
    } 
    else{ 
     // Cell is being reused; reset all subviews/state etc. 

     cell.switch.on = false 
    } 

    /*Assign Object to cell*/ 
    cell.hotspot = object 

    return cell 
} 

(В качестве примечания, я сильно рекомендую вам перейти на использование dequeueReusableCellWithIdentifier(_: forIndexPath:) вместо, он автоматически делает инстанцирование для вас в случае, если нет ячейки для повторного использования в бассейне, так что ваш код становится короче и проще)

в качестве альтернативы, вы можете сделать клетку заботиться о нем, когда вы назначаете модель объект:

class NearestCell : UITableViewCell { 

    var hotSpot:<(The Class of hotspot)> { 
     didSet { 
      // (Update state of the switch, cell's title label, etc. 
      // based on the new value of hotspot.) 
     } 
    } 
+0

Здравствуйте @NicolasMiari. Я пробовал оба подхода. 'Если ячейка == ноль { // Cell совершенно новый, нет необходимости убирать: клеток = NearestHsCell (стиль: UITableViewCellStyle.Default, reuseIdentifier: "tempHsCell") } еще { // Клетка быть повторно; сбросить все подпункты/состояние и т. д. cell.switch.on = false } ' Он работает.Но нижняя сторона - это когда я прокручиваю вниз и снова прокручиваю выбранный Swtich, также снимается. –

+1

Это потому, что ваша модель данных не «запоминает» состояние переключателя. Я предполагаю, что когда вы переворачиваете переключатель, объект горячей точки, связанный с ячейкой, должен сохранять это состояние. В следующий раз, когда вы назначаете тот же объект горячей точки в новую ячейку, эта ячейка должна соответствующим образом обновить соответствующие подпрограммы (т. Е. Установить переключатель). Имеет ли это смысл? –

+1

Клетки могут использоваться повторно для повышения эффективности; в любое время существует только число экземпляров, необходимых для скрипта. Ваши ячейки должны иметь возможность восстановить любое состояние, связанное с отображением определенной строки вашей модели данных. –

0

У меня была аналогичная проблема с несколькими UISwitches внутри набора ячеек UITableViewCell. Это был «addTarget», который был уложен поверх других. Удалите их, прежде чем решить проблему.

cell.optionSwitch.on = configManager.distanceMetric; 
[cell.optionSwitch removeTarget:self action:nil 
forControlEvents:UIControlEventTouchUpInside]; 
[cell.optionSwitch addTarget:self action:@selector(updateDistanceMetric:) 
forControlEvents:UIControlEventTouchUpInside]; 

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

  • Нет связанных вопросов^_^