1
  • ストーリーボードを使用してviewcontrollerに質問を表示しようとしています。ユーザーがクリックすると回答が表示されます。ビュー
    コントローラーから別のコントローラーに移動します。もう一方のView Controllerは
    答えを表示するだけで、戻るボタンがあります。
  • どちらのビューコントローラーも同じ
    クラスを使用します。
    ユーザーは、質問からアプリ内のある文字列から別の文字列に次と前を切り替えることができます。
  • 最初の質問で [show answer] をクリックすると
    、回答配列の最初の文字列が表示されますが、次の
    質問に移動して [show answer] をクリックすると、同じ答えが表示されます。
  • ib action showanswer をリンクしましたが、何の効果もないようです。Show Answer ボタンは
    、セグエを介して他のビュー コントローラに移動し、ib アクションの show answer もリンクされています。

私の質問は、ibアクション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
4

3 に答える 3

1

先週書いたプロトタイプにも似たようなものがあります。これは簡単で汚いプロトタイプだったので、実際にこれらのいくつかをハードコーディングしました。例を見ることができるように、それをあなたと共有できます。私のセグエコードは次のようになります。

- (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 メソッドを呼び出します (注意してください、これはメソッドのかなり悪い名前です。プロパティを使用し、名前付きの文字列がある場合カテゴリ名のプロパティは、合成が呼び出されたときに SetCategoryname メソッドを生成します. したがって、「SetValueOfCategoryName」または「UpdateCategoryNameString」のようなより適切な名前を付けたいと思うでしょう。

とにかく、私の CategoryViewController では、そのメソッドは次のようになります。

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

}

簡単です。おそらく、そこでメソッドを作成する代わりに、カテゴリ名のアクセサーを呼び出すだけで済みます。後から考えると、おそらく午前 3 時に書いた以外に、なぜそのようにしたのかわかりませんが、動作するので、私が持っているものとまったく同じものをあなたに差し上げます。次に、CategoryViewController で、viewWillAppear メソッドは次のようになります。

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

lblDiscover は私のラベルの 1 つなので、表示される前にその値を設定しました。必要に応じて viewDidAppear メソッドで行うこともできますが、テキストが変更されると少しちらつくことがあります。

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

それがいくつか役立つことを願っています。Windowsで作業していたときに以前の回答を書いたので、すべて記憶で思い出す必要がありましたが、それでも機能するはずです。

于 2013-06-08T00:23:04.397 に答える
1

ビューをプッシュして ans を表示すると、わかりました。ゼロに設定された可変ステップ。そのため、プロパティとしてステップを作成する必要があります。または、ステップをクラス変数 (静的) として作成します。

于 2013-06-07T18:11:11.677 に答える
0

ああ、あなたの問題は、セグエを呼び出してコードを呼び出すボタンがあることだと思います。どちらか一方のみを行う必要があります。したがって、show answer の ibaction を削除して、次のようなものを使用する必要があります。

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

私が通常そのようなことをするのは、私が取り組んでいるものではないView Controllerのラベルにテキストを設定する代わりに、テキストをプロパティとして渡し、代わりに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;

プロパティを使用して「self」キーワードを使用している場合も重要です。作業中のオブジェクトにプロパティを設定していると思っていたのに、実際には別のオブジェクトに値を設定するか、新しいオブジェクトをまとめて作成してその値を設定します。それが役立つことを願っています!

于 2013-06-07T17:58:06.320 に答える