Загрузка пользовательского значения ячейки из массива в зависимости от выбора пользователя в Swift

У меня есть uitableview с пользовательской ячейкой. Пользовательская ячейка содержит метку и две кнопки. Для каждого объекта (метка, uibuttons) я загружаю отдельное значение из трех отдельных массивов.

Label = [which fruit do you prefer?, Apple which color?, Orange which color?,    
orange which price?, Apple which price?]
Uibutton1 = [apple, green, deep orange, 5.99, 4.99]
Uibutton2 = [orange, red, yellow, 2.99, 1.99]

Моя цель - загрузить первое значение для всех трех объектов в ячейку, а затем добавить значения ячейки в зависимости от выбора пользователя.

Например, если первый вопрос «Какие фрукты вы предпочитаете?»

И пользователь отвечает апельсинами, ячейка с третьим объектом (для uilabel и двух uibuttons) загружается, что приведет к

Оранжевый какого цвета?

Темно-оранжевый Желтый

Любые идеи приветствуются.

Спасибо.


person David Robertson    schedule 14.08.2015    source источник


Ответы (1)


Я рекомендую использовать перечисление и вычисляемые свойства:

enum Question {
    case WhichFruit, AppleColor, OrangeColor, ApplePrice, OrangePrice
}
var currentQuestion: Question = .WhichFruit {
    didSet { updateTitles() }
}

var questionText: String {
    switch currentQuestion {
    case .WhichFruit: return "Which fruit do you prefer?"
    case .AppleColor, .OrangeColor: return "Which color?"
    case .ApplePrice, .OrangePrice: return "Which price?"
    }
}
var button1Text: String {
    switch currentQuestion {
    case .WhichFruit: return "Apple"
    case .AppleColor: return "Green"
    case .OrangeColor: return "Deep Orange"
    case .OrangePrice: return "5.99"
    case .ApplePrice: return "4.99"
    }
}
//continue for button2
//...

Затем, чтобы загрузить исходные данные:

override func viewDidLoad() {
    currentQueston = .WhichFruit
}
private func updateTitles() {
    questionLabel.text = questionText
    buttonOne.setTitle(button1Text, forState: UIControlState.Normal)
    buttonTwo.setTitle(button2Text, forState: UIControlState.Normal)
}

А затем в действиях кнопки обновите currentQuestion и снова вызовите updateTitles.

func buttonOneWasPressed {
    switch currentQuestion {
    case .WhichFruit: //selected Apple
        currentQuestion = .AppleColor
    }
    //other cases here
}

Надеюсь это поможет!

person jnoor    schedule 14.08.2015
comment
Большое спасибо! Я попробую код. Первое, что приходит на ум — а что, если у меня будет гораздо больше возможностей во всех массивах? я должен писать дела каждый раз? - person David Robertson; 14.08.2015
comment
Если вы планируете использовать точно такие же ярлыки и кнопки, то да. При этом, спроектировав его таким образом, не должно быть слишком много усилий для добавления новых опций. Кроме того, если это решение в конечном итоге удовлетворит ваши потребности, отметьте мой ответ как принятый. Спасибо - person jnoor; 16.08.2015
comment
На самом деле, теперь, когда я думаю об этом, вы могли бы использовать didSet в currentQuestion, чтобы всегда вызывать обновление. var currentQuestion: Question = .WhichFruit { didSet {updateTitles()} } -- см. исправленный ответ - person jnoor; 16.08.2015