2016-05-29 2 views
1

Мне нужно событие, которое изменяет переменную, на основе которой TableViewCell я нажимаю. Но в отличие от действия, связанного с кнопкой, индикатор активности для ячеек таблицы вообще отсутствует. Поэтому мой вопрос:Изменение переменной на основе таблицы View Cell

Я хочу создать TableView, содержащий элементы массива. На основании того, какой элемент я нажимаю, я хочу изменить свою переменную, чтобы результат на следующем ViewController зависел от того, какую кнопку вы нажимаете.

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

На первом TableViewController у меня есть список, основанный на массиве и на втором ViewController У меня есть ярлык, который показывает текст на основе переменной.

У меня есть nameArray = ["Mum", "Brother", "Me"] и weightArray = [140, 160, 120] и переменная weight = 0. Метка второго ViewController сообщает весу var. Поэтому, когда вы нажимаете «Мама» в TableView, я хочу, чтобы следующий ViewController сказал 140, когда я нажимаю «Брат», затем 160 и так далее ...

До сих пор все работает отлично, и у меня нет проблем с чем-либо, кроме изменения var, на основе того, что я нажимаю.

Длинная история, короткая чувство:

Я хочу, чтобы действие для TableViewCell, который изменяет вар как в действии, подключенное к кнопке, но нет никакого выхода действий клеток на всех.

+0

См. ['UITableViewDelegate'' tableView: didSelectRowAtIndexPath: '] (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableViewDelegate_Protocol/#//apple_ref/occ/intfm/UITableViewDelegate/tableView: didSelectRowAtIndexPath :) – luk2302

ответ

1

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

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

      var cell : UITableViewCell = tableView.cellForRowAtIndexPath(indexPath)! 
switch cell.labelSubView.text as! String { 
case "Mum": 
    self.weight = weightArray[0] 
case "Brother" 
    self.weight = weightArray[1] 

and so on.. 
.. 
default: 
    statements 
} 
 } 

Примечание Лучшей альтернативой

Я также рассмотрел случай, когда у вас слишком много записей в NameArray и оператор switch могут быть не очень хорошими. В этом случае вы можете получить текст внутри выбранной строки на cell.labelSubView.text as! String

Далее вы можете проверить, содержит ли имяArray текст ячейки и получает индекс имени, соответствующий типу ячейки. Затем вы можете получить требуемый вес с тем же индексом в weightArray. А затем do self.weight = weightArray[requiredIndex]

Надеюсь, что это поможет.

Обновление: Мой опытный друг @ Duncan упомянул ниже, что оператор switch в этом случае является плохой практикой кодирования. Я не собираюсь удалять его, потому что это урок для меня, а также моих коллег-программистов, которые относительно новы для программирования.Так я положил его в желтом поле, заявив, что это не хороший код

Лучшим вариантом для этого будет:

  1. Как отмечает Дункан, создавая массив словаря хороший вариант
  2. Второй вариант является вариант в моем ответе после моего Примечание
+0

Ваш ответ - шаг в правильном направлении, но вы показываете метод 'didSelectRowAtIndexPath ', создавая ** переменную строку ** ** и сохраняя выбранную строку там. Это не помогает OP, потому что эта переменная уходит, как только функция заканчивается. –

+0

@ DuncanC см. Обновление. –

+0

Ух! Извините, это ужасный совет. Зачем писать пользовательский оператор switch, который необходимо поддерживать при изменении данных. Почему бы не создать массив словарей или других структур данных, содержащих данные, а затем просто мимо данных. –

-1

Вы должны поддерживать множество словарей, эти словари есть ключи, как «человек», и «вес», то вы можете легко получить значение веса после выбора ячейки с помощью метода представления таблицы таблицы. Таблица TableView: didSelectRowAtIndexPath:

-1

Создайте переменную экземпляра в контроллере представления (var на верхнем уровне после определения класса) для выбранной ячейки.

class MyTableViewController: UIViewController 

var selectedRow: Int 


override func tableView(tableView: UITableView, 
    didSelectRowAtIndexPath indexPath: NSIndexPath) 
{ 
    selectedRow = indexPath.row 

    //invoke a segue if desired 
    performSegueWithIdentifier("someSegue"); 
} 


override func prepareForSegue(segue: UIStoryboardSegue, 
    sender: AnyObject?) 
{ 
    if segue.identifier == "someSegue" 
    { 
    //Cast the destination view controller to the appropriate class 
    let destVC = DestVCClass(segue.destinationViewController) 
    destVC.selectedRow = selectedRow 
    } 
} 

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

+0

Почему проголосовали? Если вы чувствуете, что мой ответ отсутствует, напишите комментарий, объясняющий почему. –

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