Метод 1: Предотвратить повторное использование клеток путем, Держа все объекты ячейки в массиве
var arraysCells : NSMutableArray = []//globally declare this
в viewDidLoad()
for num in yourQuestionArray//this loop is to create all cells at beginning
{
var nib:Array = NSBundle.mainBundle().loadNibNamed("SegmentTableViewCell", owner: self, options: nil)
var cell = nib[0] as? SegmentTableViewCell
arraysCells.addObject(cell!);
}
в tableViewDelegate,
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
return arraysCells.objectAtIndex(indexPath.row) as! UITableViewCell
}
вы можете найдите выбранные значения сегмента (swer) итерацией arraysCells
Примечание: Метод 1 будет медленным, если у вас есть большое количество клеток
Метод 2: Повторное использование ячейки как обычно, но сохранить состояния (enterd значения) Использование делегата и массивов.
в пользовательских UITableViewCell
@objc protocol SegmentTableViewCellDelegate {
func controller(controller: SegmentTableViewCell, selectedSegmentIndex:Int, indexPath : NSIndexPath)
}
class SegmentTableViewCell: UITableViewCell {
var delegate: AnyObject?
var indexPath : NSIndexPath?
@IBOutlet weak var segment: UISegmentedControl! //outlet of segmented Control
@IBAction func onSegmentValueChanged(sender: UISegmentedControl/*if the parameter type is AnyObject changed it as UISegmentedControl*/)//action for Segment
{
self.delegate?.controller(self, selectedSegmentIndex: sender.selectedSegmentIndex, indexPath: indexPath!)
}
в ViewController
class MasterViewController: SegmentTableViewCellDelegate{
var selectedAnswerIndex : NSMutableArray = [] //globally declare this
var selectedSegmentsIndexPath : NSMutableArray = [] //globally declare this
func controller(controller: SegmentTableViewCell, selectedSegmentIndex:Int, indexPath : NSIndexPath)
{
if(selectedSegmentsIndexPath.containsObject(indexPath))
{
selectedAnswerIndex.removeObjectAtIndex(selectedSegmentsIndexPath.indexOfObject(indexPath))
selectedSegmentsIndexPath.removeObject(indexPath)
}
selectedAnswerIndex.addObject(selectedSegmentIndex)
selectedSegmentsIndexPath.addObject(indexPath)
}
в cellForRowAtIndexPath (Tableview делегат)
if(selectedSegmentsIndexPath.containsObject(indexPath))
{
cell?.segment.selectedSegmentIndex = selectedAnswerIndex.objectAtIndex(selectedSegmentsIndexPath.indexOfObject(indexPath)) as! Int
}
cell?.delegate = self
cell?.indexPath = indexPath
вы можете получить результат на
for index in selectedSegmentsIndexPath
{
var cellIndexPath = index as! NSIndexPath
var answer : Int = selectedAnswerIndex.objectAtIndex(selectedSegmentsIndexPath.indexOfObject(cellIndexPath)) as! Int
NSLog("You have enterd answer \(answer) for question number \(cellIndexPath.row)")
}
могли бы вы объяснить более, где ваш сегмент? внутри ячейки таблицы? –
есть .. внутри UITableView. Хавин 10 строк. –
Нам нужен код. Однако похоже, что сегментированный элемент управления находится внутри ячейки.В этом случае, когда tableView: cellForRowAtIndexPath вызывается и вы удаляете ячейку, вы должны инициализировать все компоненты внутри ячейки. Поскольку ячейки повторно используются, вы получите несколько компонентов, показывающих значения других ячеек, а не те, которые вы хотите. – ncerezo