0

私は iOS プログラミングとプログラミング全体に不慣れで、現在取り組んでいるプロジェクトに問題があります。質問の配列を含むオブジェクトに質問を保存したいクイズアプリケーションに取り組んでいます。次に、私のクイズ ViewController は問題バンクをインポートし、それらの問題をUILabelビューに表示します。

これが初心者の問題である場合は申し訳ありませんが、私はそれを理解できないようであり、Web検索もあまり役に立ちませんでした. 私はまだ学習プロセスのかなり早い段階です。

私が持っている: ViewController.h ViewController.m QuestionBank.h QuestionBank.m

QuestionBank.h で:

//QuestionBank.h

#import <Foundation.h>

@interface QuestionBank : NSObject

- (id)initWithQuestionsArray:(NSMutableArray *)questions;
@property (nonatomic, copy) NSMutableArray *questions;
@property in currentQuestionIndex;
@property (nonatomic, copy) NSString *currentQuestion;
@end

QuestionBank.m では:

//QuestionBank.m

#import "QuestionBank.h"

@implementation QuestionBank;
@synthesize questions _questions;
@synthesize currentQuestionIndex;
@synthesizeCurrentQuestion;

- (id)initWithQuestionsArray:(NSMutableArray *)questions
   {
    self = [super init];
    if (self) {
    questions = [[NSMutableArray alloc] init];
    [_quesitons addObject:@"What is the 14 +6?];
    [_questions addObject:@"What is my name?"];
    [_questions addObject:@"What is my age?"];
    }
    return self;
}

- (void)setCurrentQuestion:(NSString *)q
{
    q = [_questions objectAtIndex:currentQuestionIndex];
}

ViewController.h 内

//ViewController.h
#import <UIKit/UIKit>
@class QuestionBank;

@interface ViewController : UIViewController <UINavigationController Delegate>

@property (weak, nonatomic) IBOutlet UILabel *questionLabel;
@property (retain, nonatomic) QuestionBank *questionBank;

ViewController.m 内

#import "ViewController.h"
#import "QuestionBank.h"

@implementation ViewController
@synthesize questionLabel;
@synthesize questionBank;

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.title = _subjectName;

    if (self.title == @"AGK") {
    [_questionLabel setText:self.questionBank.currentQuestion];
    NSLog(@"AGK was selected");
    }
}

コードを使用すると、配列にある質問が表示されませんUILabel(ラベルは に適切に接続されていますViewController)。

エラーを指摘したり、これを機能させる方法について提案を共有したり、コードの他の場所で行うことができる一般的な改善を共有したりしてください。

4

1 に答える 1

0

コードにはかなりの数の問題があり、いくつかの修正が必要です。それらのいくつかを次に示します。

Objective Cで変数を関数に渡す方法を完全に理解しているとは思いません。たとえば、-(void)setCurrentQuestion:(NSString *)qメソッドでは、実際には何もしていません。たとえば、ふりプログラムで次のコードをデモンストレーションさせてください。

- (void)testStringPassing:(NSString *)string
{
    string = @"Goodbye World!";
}

- (void)viewDidLoad
{
    NSString *string = @"Hello World.";
    [self testStringPassing:string];
    NSLog(@"%@", string);
}

このサンプルコードでは、「GoodbyeWorld」ではなく「HelloWorld」をログに記録します。したがって、基本的に、-(void)testStringPassing:(NSString *)stringは実際には何もしていません。「string」の値を変更したい場合は、次のようなことを行います。

- (NSString *)testStringPassing
{
    return @"Goodbye World";
}

- (void)viewDidLoad
{
    NSString *string = @"Hello World";
    string = [self testStringPassing];
    NSLog(@"%@", string);
}

testStringPassingの値を返し、「string」をその値と等しくなるように設定するため、このコードは「GoodbyeWorld」をログに記録します。

繰り返しますが、これはコードに関係します。これは、-(void)setCurrentQuestion(NSString *)qメソッドが、実際には何も実行しない最初の例のようなものだからです。

クラスを使用する前に、クラスを割り当てて初期化する必要があります。ViewControllerで、割り当てて初期化する前に、questionBankクラスを使用しようとします。次のようなものを試してください。

- (void)viewDidLoad
{
    [super viewDidLoad]
    self.questionBank = [[QuestionBank alloc] init];

    //the rest of your code here
}

上記の2つの問題の組み合わせは、カスタム初期化子として-(id)initWithQuestionsArray:(NSMutableArray *)質問を使用しているが、渡された値を何にも使用していないことです。現在のコードでは、-(id)initWithQuestionsArray:(NSMutableArray *)questionsコードを次のコードに置き換えることをお勧めします。

- (id)init
{
    self.questions = [[NSMutableArray alloc] init];
    [self.questions addObject:@"Your Question Text Goes Here!!!!"];
    [self.questions addObject:@"Another question can go here."];
}

アンダースコアの命名規則は、プロパティを合成し、生成されたゲッターとセッターを使用するという点を打ち負かすため、ObjectiveCでは眉をひそめています。特にあなたはただ学んでいるだけなので、私はアンダースコア表記を放棄します。交換

@synthesize questions _questions;

@synthesize questions;

次に、質問配列にアクセスする場所で、_questionsの代わりにself.questionsを使用します。

とにかく、それはあなたが正しい方向に着手/指示されるのに十分なはずです。JUST Objective Cに焦点を当てた本を選ぶことを強くお勧めします。iOSの学習は素晴らしいですが、多くのリソースは、Objective Cをすでに知っているか、よく知っていることを前提としていますが、そうではないようです。

于 2012-08-30T18:44:42.190 に答える