Как показать ответы запрограммированного приложения iPhone типа флеш-карты между двумя массивами, xcode?

  • Я пытаюсь отобразить вопросы в контроллере представления, используя раскадровки, и когда пользователь нажимает, показывает ответ. Он переносит его из контроллера view
    в другой. Другой контроллер представления просто показывает
    ответ и имеет кнопку "Назад".
  • Оба контроллера представления используют один и тот же класс
    . Пользователь может переключать следующее и предыдущее из одной строки
    в другую в приложении из вопроса.
  • Когда я нажимаю «Показать ответ на первый вопрос», я
    вижу первую строку в массиве ответов, которая говорит «смеется», но когда я перехожу к следующему
    вопросу и нажимаю «Показать ответ», он говорит тот же ответ.
  • Я связал действие ib showanswer, но, похоже, это не дало никакого эффекта. Кнопка «Показать ответ» переходит к другому контроллеру представления
    через переход, а также имеет связанный с ней ответ ib action show.

Итак, мой вопрос: что я делаю неправильно в ib action showAnswer? Если я неправильно подхожу к этому приложению типа карточки, что я делаю неправильно?

//
//  BiologyViewController.m
//  Biology
//
//  Created by Jacob Brans on 6/6/13.
//  Copyright (c) 2013 Jacob Brans. All rights reserved.
//

#import "BiologyViewController.h"

@interface BiologyViewController ()

@end

@implementation BiologyViewController
@synthesize labelsText;
@synthesize textView, textViewanswer1;



-(void)viewDidLoad {
    [super viewDidLoad];

    titles = [NSArray arrayWithObjects:// Time Together
              @"What is Biology?",@"What is yo mamma?",nil];
    step= 0;
    textView.text = [titles objectAtIndex:step];
    answers = [NSArray arrayWithObjects:// Time Together
              @"lol",@"wow",nil];
    textViewanswer1.text = [answers objectAtIndex:step];



    labelsText.text = [NSString stringWithFormat:@"%d/%d", step+1, titles.count];

}


-(IBAction)showanswer:(id)sender{
    textViewanswer1.text = [answers objectAtIndex:step];

}

-(IBAction) nextclicked:(id)sender{
    // titles = [NSArray arrayWithObjects:@"iology is the scientific study of life. Bam",@"This works? Wow",@"lol", nil];
    if (step<titles.count-1) {
        step++;
    }
    else
    {
        step= 0;
    }
    textView.text = [titles objectAtIndex:step];
    labelsText.text = [NSString stringWithFormat:@"%d/%d", step+1, titles.count];
}





-(IBAction) prevClicked:(id)sender{
    //  titles = [NSArray arrayWithObjects:@"Biology is the scientific study of life. Bam",@"This works? Wow",@"Still Works.",@"garret is the coolest awesome person awesome wowowowwwwwwwwwwwwwwwwwwwwwwwwwww", nil];
    if (step>0) {
        step--;
    }
    else
    {
        step =titles.count-1;
    }
    textView.text = [titles objectAtIndex:step];
    labelsText.text = [NSString stringWithFormat:@"%d/%d", step+1, titles.count];
}


-(IBAction) randomClicked:(id)sender{

    step = 1+arc4random() %(titles.count);


    textView.text = [titles objectAtIndex:step];
    labelsText.text = [NSString stringWithFormat:@"%d/%d", step+1, titles.count];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

person jacobohunter    schedule 07.06.2013    source источник
comment
что такое step (свойство, статическая переменная)??   -  person Roshan    schedule 07.06.2013


Ответы (3)


У меня есть нечто подобное в прототипе, который я написал на прошлой неделе. Это был быстрый и грязный прототип, поэтому я на самом деле жестко запрограммировал некоторые из этих вещей. Я могу поделиться им с вами, чтобы вы могли увидеть пример. Мой код перехода выглядит так:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"DessertsCategory"]) {
        CategoryViewController *cvc = (CategoryViewController *)[segue destinationViewController];
        [cvc setCategoryname:@"Desserts"];
    } else if ([[segue identifier] isEqualToString:@"KidsCraftCategory"]){
        CategoryViewController *cvc = (CategoryViewController *)[segue destinationViewController];
        [cvc setCategoryname:@"Kids Crafts"];
    } else if ([[segue identifier] isEqualToString:@"PartyCategory"]){
        CategoryViewController *cvc = (CategoryViewController *)[segue destinationViewController];
        [cvc setCategoryname:@"Party"];
    } else if ([[segue identifier] isEqualToString:@"TrendingCategory"]){
        CategoryViewController *cvc = (CategoryViewController *)[segue destinationViewController];
        [cvc setCategoryname:@"Trending"];
    }
}

Основные вещи, ищите идентификатор перехода (у меня есть переход для каждой кнопки), получите контроллер назначения и вызовите для него этот метод setCategoryname (обратите внимание, это довольно плохое имя для метода. Если вы используете свойства и имеете строку с именем Categoryname свойство будет генерировать для вас метод SetCategoryname при вызове синтеза, поэтому вам нужно дать ему лучшее имя, например «SetValueOfCategoryName» или «UpdateCategoryNameString», что бы вы ни хотели, просто избегайте set+propertyName).

Во всяком случае, в моем CategoryViewController этот метод выглядит так:

-(void)setCategoryname:(NSString *)categoryName {
    self.categoryName = categoryName;

}

Легко, вы, вероятно, могли бы просто вызвать метод доступа к имени категории вместо того, чтобы создавать там метод. Оглядываясь назад, я не уверен, почему я сделал это именно так, кроме того, что я, вероятно, написал это в 3 часа ночи, но это работает, поэтому я дам его вам точно так, как он у меня есть. Затем в моем CategoryViewController мой метод viewWillAppear выглядит так:

-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    self.lblDiscover.text = self.categoryName;
}

lblDiscover — это одна из моих меток, поэтому я просто устанавливаю это значение до того, как оно появится. Вы могли бы сделать это в методе viewDidAppear, если хотите, но при изменении текста может быть небольшое мерцание:

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    self.lblDiscover.text = self.categoryName;
}

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

person Jake Hargus    schedule 08.06.2013
comment
Я обязательно попробую сегодня, Джейк, спасибо за помощь. Я попробовал ваш предыдущий ответ, и ваш способ кажется хорошим, я просто не могу заставить этот первый способ работать. Я собираюсь попробовать ваш новый способ позже. Еще раз спасибо. - person jacobohunter; 08.06.2013
comment
Джейк, значит, весь этот код входит в начальный класс контроллера представления? Или мне нужен второй класс? - person jacobohunter; 08.06.2013
comment
Я пошел дальше и принял ваш ответ, Джейк, как ответ, но я просто решил избежать перехода и просто иметь две кнопки, одна из которых показывает ответ, а другая показывает вопрос на том же экране и в том же классе. Вообще немного кодил, ха-ха. Спасибо всем за поддержку! - person jacobohunter; 08.06.2013
comment
Это использование двух классов. Если вы используете анимацию переворота, это будет выглядеть так, как будто карта переворачивается. Первый блок кода будет на вашем контроллере просмотра вопросов, а остальная часть кода будет на вашем контроллере ответов. Помимо метода viewWillAppear и метода закрытия контроллера представления, контроллер ответа будет завершен. Это хороший механизм для легкого открытия и закрытия ответа с помощью флипа. Две кнопки тоже работают, просто меняя текст. Рад, что вы нашли то, что сработало! - person Jake Hargus; 11.06.2013

Хорошо, когда вы нажали свое представление, чтобы показать ответ. Переменный шаг установлен на ноль. поэтому вам нужно сделать шаг как свойство. Или сделайте Step переменным классом (статическим).

person Prateek Prem    schedule 07.06.2013

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

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"WhateverMySegueIsNamed"]) {
        MyViewController *controller = segue.destinationViewController;
        controller.textViewanswer1.text = [answers objectAtIndex:step];
    } 
}

Что я обычно делаю для чего-то подобного, так это то, что вместо того, чтобы устанавливать текст на метке на контроллере представления, который не является тем, над которым я работаю, я передам текст как свойство и вместо этого сделаю это на viewWillAppear. Что-то типа:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        if ([segue.identifier isEqualToString:@"WhateverMySegueIsNamed"]) {
            MyViewController *controller = segue.destinationViewController;
            controller.AnswerString = [answers objectAtIndex:step];
        } 
    }

тогда в представлении появится у меня что-то вроде

[super viewWillAppear:animated];
self.lblAnswer.text = self.AnswerString;

Это также важно, если вы используете свойства для использования ключевого слова «я», у меня были случаи (и на других языках), где я думал, что устанавливаю свойство для объекта, над которым я работал, но на самом деле это устанавливало значение на другом объекте или создание нового объекта вместе и установка этого значения. Надеюсь, это поможет!

person Jake Hargus    schedule 07.06.2013
comment
Вы дали своему переходу идентификатор? Если вы нажмете на переход, а затем перейдете к инспектору атрибутов (четвертый значок в верхней части правой панели), там появится текстовое поле под названием «Идентификатор». Вам нужно дать ему имя, а затем заменить строку WhateverMySegueIsNamed этим идентификатором. Я до сих пор не уверен, будет ли это текстовое поле настроено таким образом, поскольку это элемент пользовательского интерфейса. Чтобы быть в безопасности, я бы создал свойство для этой строки и сделал бы метод отображения. Это самый безопасный способ сделать это. - person Jake Hargus; 08.06.2013