2016-02-02 2 views
0

У меня есть UIViewController, и в этом у меня есть ряд вопросов, которые я извлекаю из запроса sqlite3. Затем я использую цикл for для повторения каждого вопроса в массиве, чтобы изменить UILabel.text, чтобы отобразить вопрос на экране. Это фактически работает для первого вопроса в массиве!Обновление UILabel.Text внутри цикла for после нажатия кнопки

У меня есть четыре кнопки для ответов. Я хочу сделать так, если нажата одна из кнопок, ответ сохраняется, а следующий вопрос в цикле обновляет UILabel.text.

Эти четыре ответа никогда не меняются, поскольку это скорее опрос, чем ответы, поэтому один из ответов «Я согласен» или «не согласен», поэтому текст кнопки никогда не изменяется. Возможно ли это?

Я был здесь и Google, чтобы найти способ связать нажатой кнопку с завершением каждой итерации цикла без какой-либо удачи.

+0

Пожалуйста, напишите, какой у вас код и какая часть не работает. Текущий вопрос слишком открытый. – bearMountain

+0

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

ответ

0

Почему вы повторяете вопросы и меняете текст UILabel? Не следует ли это менять только при нажатии одной из кнопок съемки?

Если я правильно получил, вы должны сделать следующее:

1) Объявляются три свойства в контроллере: NSArray * вопросы, NSMutabelArray * ответы, NSInteger currentIndex;

2) Инициировать/выложить их в viewDidLoad (кроме currentIndex, конечно, установить его в 0).

3) Заполните массив вопросов со строками вопросов.

4) Установите текст в UILabel, label.text = вопросы [currentIndex];

5) создать метод IBAction и связать его со всеми кнопками опроса.

6) в методе IBAction, введите название кнопки в массив ответов и покажите следующий вопрос.

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.questions = {your questions array}; 
    self.answers = [[NSMutableArray alloc] init]; 
    self.currentIndex = 0; 

} 

- (IBAction)btnClicked:(id)sender { 

    UIButton *btn = (UIButton *)sender; 
    NSString *title = btn.titleLabel.text; 
    [self.answers addObject:title]; 

    currentIndex++; 
    label.text = questions[currentIndex]; 
} 

Надеюсь, вы поймете код.

+0

Я понятия не имел, что могу связать несколько кнопок с одним действием. Я перебирал массив вопросов, потому что считал, что проще всего перебирать каждый вопрос и перестать ждать ответа, но это решение выглядит намного проще. Я попробую это позже и посмотрю, работает ли это. Этот код: UIButton * btn = (UIButton *) отправитель; установить все кнопки в действие? Благодарим вас за помощь! –

+0

С помощью итераций вы не сможете дать пользователю возможность прочитать/ответить на вопросы. О привязке кнопок к IBActions нет никаких ограничений. Вы можете связать несколько кнопок с одним IBAction через Interface Builder или программно с помощью [answer_btn_1 addTarget: self selector: @selector (объект btnClicked :): nil]; и т. д., применимые ко всем вашим кнопкам. – timurbeg

+0

Ах, спасибо! В массиве всего около 5 вопросов (прямо сейчас), все с одинаковыми ответами на выбор. В конце последнего элемента массива я хочу, чтобы он отображал текст «Готово» или что-то в этом роде, а для комментариев - следующую кнопку для другого представления. Сегодня я попробую связать все мои кнопки с одним действием и использовать код, который вы указали выше. Я видел множество обучающих программ для викторины с разными ответами на каждый вопрос, но почти ничего не видел для большего количества приложений типа опроса. –

0

Короче говоря, да, это возможно.

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

// In the interface of your .m file 
int questionIndex; 

// In viewDidLoad of your controller, however this will start for index 0, the beginning of your questions array 
questionIndex = 0 

Сохраняя индекс в NSUserDefaults, вы можете захватить его в ViewDidLoad, и начать, где пользователь последний раз остановились:

[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:questionIndex] forKey:@"questionIndex"]; 

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

- (void)answerTapped:(UIButton *)answerButton 
{ 
    // Grab the answer from the text within the label of the button 
    // NOTE: This assume your button text is the answer that you want saved 
    NSString *answer = answerButton.titleLabel.text; 

    // You can use your questionIndex, to store which question this answer was for and you can then take the answer and store it in sqlite or where you prefer... 

} 

Вы можете добавить этот метод к кнопкам как так

[answerButton addTarget:self action:@selector(answerTapped:) forControlEvents:UIControlEventTouchUpInside]; 

Теперь вы можете написать метод для увеличения значения questionIndex, когда нажата кнопка ответа.

- (void)incrementQuestionIndex 
{ 
    // Increment index 
    questionIndex += 1; 

    // Update and save value in UserDefaults 
    [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:questionIndex] forKey:@"questionIndex"]; 

} 

Затем вы можете вызвать отдельный окончательный метод для обновления метки вопроса.

- (void)updateQuestionLabel 
{ 

    // Grab the question using the index (omit this line and go straight to the next if storing the index in an iVar) 
    questionIndex = [[[NSUserDefaults standardUserDefaults] objectForKey:@"questionIndex"] integerValue]; 

    // Grab the question using the index. Assumes you have a questions array storing your questions from sqlite. 
    NSString *question = [questions objectAtIndex:questionIndex]; 

    // Update the question UILabel 
    [questionLabel setText:question]; 
} 
Смежные вопросы