2016-02-25 3 views
0

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

Любые идеи о том, как я могу решить эту проблему. Я видел подобные вопросы в стеке, но большинство из них находятся в ObjC.

Код:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 

     tableView.deselectRowAtIndexPath(indexPath, animated: true) 

     var weightValue: String? = unitsDefaults.objectForKey(kCCWeightKeyMetric) as! String? 
     var distanceValue: String? = unitsDefaults.objectForKey(kCCDistanceKeyMetric) as! String? 
     let cell = tableView.cellForRowAtIndexPath(indexPath) 


     if indexPath.row == 0 { 

      weightValue = "pounds" //Set to this for the default value of weight 
      unitsDefaults.setObject(weightValue, forKey: kCCWeightKeyMetric) //Save the kg value 

      distanceValue = "miles" //Set to this for the default value of distance 
      unitsDefaults.setObject(distanceValue, forKey: kCCDistanceKeyMetric) //Save the km value 

      cell?.accessoryType = UITableViewCellAccessoryType.Checkmark 

      unitsDefaults.synchronize() 

      //Check mark Selection 
      if unitsDefaults.stringForKey(kCCDistanceKeyMetric)! == "miles" { 

       cell?.accessoryType = UITableViewCellAccessoryType.Checkmark 

      } else if unitsDefaults.stringForKey(kCCDistanceKeyMetric)! == "km"{ 

       cell?.accessoryType = UITableViewCellAccessoryType.None 
      } 


     } else { 

      weightValue = "kg" //Set to this for the default value of weight 
      unitsDefaults.setObject(weightValue, forKey: kCCWeightKeyMetric) //Save the kg value 

      distanceValue = "km" //Set to this for the default value of distance 
      unitsDefaults.setObject(distanceValue, forKey: kCCDistanceKeyMetric) //Save the km value 

      unitsDefaults.synchronize() 

      //Check mark Selection 
      if unitsDefaults.stringForKey(kCCDistanceKeyMetric)! == "km" { 

       cell?.accessoryType = UITableViewCellAccessoryType.Checkmark 

      } else if unitsDefaults.stringForKey(kCCDistanceKeyMetric)! == "miles"{ 

       cell?.accessoryType = UITableViewCellAccessoryType.None 
      } 


     } 

     //Dismiss the View 
     if let navController = self.navigationController { 
      navController.popViewControllerAnimated(true) 
     } 

    } 

enter image description here

+0

Какой источник данных вы используете для этого вида таблицы? – vadian

+0

Я использую статические ячейки в качестве статических прототипов. Следовательно, нет источника данных? Должен ли я использовать один или есть другой способ? – Gugulethu

+0

Если ячейки статичны, вам фактически не нужна 'cellForRowAtIndexPath', потому что вы можете ссылаться на все статичные с помощью' IBOutlet'. – vadian

ответ

1

ли этот тип. Я пишу в Objective-C. Вы можете получить Идею, как выполнить в Swift. Создать изменяемый словарь сказать «» cellDictionary

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellIdentifier" forIndexPath:indexPath]; 
    NSString *cellRowString =[NSString stringWithFormat:@"%ld",(long)indexPath.row]; 
    if([cellDictionary valueForKey:cellRowString]!=nil){ 
     cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    } 
    else 
    { 
     cell.accessoryType = UITableViewCellAccessoryNone; 
    } 
    return cell; 
} 


-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *cellRowString =[NSString stringWithFormat:@"%ld",(long)indexPath.row]; 
    if([cellDictionary valueForKey:cellRowString]==nil){ 
     [cellDictionary setObject:cellRowString forKey:cellRowString]; 
    } 
    [tableView reloadData]; 
} 
+0

У меня есть ячейки как статические прототипы. Означает ли это, что я должен сделать их динамичными? – Gugulethu

0

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

-(void)prepareForReuse{ 
    [super prepareForReuse]; 
    self.accessoryType = UITableViewCellAccessoryNone; 
} 
+0

было бы более правильным сбросить тип аксессуара в функции 'tableView (_ tableView: UITableView, cellForRowAt indexPath: IndexPath)' в закрывающем 'UITableViewController' – Alnitak

+0

да, это было ссылкой на случай, если ячейка является подклассом – TomCobo

0

Поскольку я использовал статические клетки, я создал IBOutlets для этих двух ячеек и сделал чек в представлении сделал нагрузку, которая тренировка хорошо.

@IBOutlet weak var firstCell: UITableViewCell! 
    @IBOutlet weak var secondCell: UITableViewCell! 

    var unitsDefaults = NSUserDefaults.standardUserDefaults() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     //Check mark Selection 
     if unitsDefaults.stringForKey(kCCDistanceKeyMetric)! == "miles" { 

      firstCell.accessoryType = UITableViewCellAccessoryType.Checkmark 
      secondCell.accessoryType = UITableViewCellAccessoryType.None 

     } else if unitsDefaults.stringForKey(kCCDistanceKeyMetric)! == "km"{ 

      firstCell.accessoryType = UITableViewCellAccessoryType.None 
      secondCell.accessoryType = UITableViewCellAccessoryType.Checkmark 

     } 
     .... 

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