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

  • Опитвам се да покажа въпроси в контролер за изглед, използвайки сценарии и когато потребителят щракне, показва отговор. Пренася го от контролера
    за изглед към друг. Другият контролер за преглед само показва
    отговора и има бутон за връщане назад.
  • И двата изглед контролера използват един и същ
    клас. Потребителят може да превключва следващ и предишен от един низ към
    друг в приложението от въпроса.
  • Когато щракна върху показване на отговор на първия въпрос, аз
    мога да видя първия низ в масива с отговори, който казва хаха, но когато отида на следващия
    въпрос и щракна върху показване на отговора, той казва същия отговор.
  • Свързах ib action showanswer, но изглежда няма ефект. Бутонът Показване на отговор отива към другия контролер за изглед
    чрез последователност и също така има ib действие показване на отговор, свързано с него.

Така че въпросът ми е какво правя погрешно в 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)


Имам нещо подобно в прототип, който написах миналата седмица. Беше бърз и мръсен прототип, така че всъщност кодирах трудно някои от тези неща. Мога да го споделя с вас, за да видите пример. Моят Segue код изглежда така:

- (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"];
    }
}

Основни неща, потърсете идентификатора на segue (имам segue за всеки бутон), вземете целевия контролер и извикайте този метод setCategoryname върху него (имайте предвид, че това е доста лошо име за метод. Ако използвате свойства и имате низ с име Categoryname свойството ще генерира метод SetCategoryname за вас, когато synthesize бъде извикан. Така че ще искате да му дадете по-добро име като „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

Добре, когато натиснахте изгледа си, за да покажете ans. Променливата стъпка е зададена на нула. така че трябва да направите стъпка като собственост. Или направете Step като променлива на класа (статична).

person Prateek Prem    schedule 07.06.2013

А, мисля, че проблемът ви е, че имате бутон, който извиква segue и извиква код. Трябва да направите само едното или другото. Така че ще искате да премахнете това ibaction за показване на отговор и да използвате нещо като:

- (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];
        } 
    }

след това на изгледа ще се появи I'd have something like

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

Също така е важно, ако използвате свойства, да използвате ключовата дума „self“, имах случаи (също и на други езици), когато си мислех, че задавам свойство на обекта, върху който работя, но всъщност задавах стойност на друг обект или създаване на нов обект заедно и задаване на тази стойност. Надявам се това да помогне!

person Jake Hargus    schedule 07.06.2013
comment
Дадохте ли идентификатор на вашия segue? Ако щракнете върху продължението и след това отидете на инспектора на атрибутите (четвъртата икона в горната част на дясната ви лента), там има текстово поле, наречено Идентификатор. Трябва да му дадете име там и след това да замените низа WhateverMySegueIsNamed с този идентификатор. Все още не съм сигурен дали това текстово поле ще се зададе по този начин, тъй като е елемент на потребителския интерфейс. За да съм в безопасност, бих създал свойството за този низ и ще направя метода за изглед ще се появи. Това е най-безопасният начин да го направи. - person Jake Hargus; 08.06.2013