2011-07-19 16 views
1

このエラーがなぜ表示されているのかわかりません。iphoneアプリケーションのヘルプ - クラスプロパティの参照に関する問題

#import <Foundation/Foundation.h> 
#import "TextInputQuestion.h" 

@interface TextInputQuestionViewController : UIViewController { 
    Question *question; 
    IBOutlet UILabel *questionTitle; 
    IBOutlet UILabel *inputLabel; 
    IBOutlet UITextField *inputAnswer; 
} 

@property (nonatomic, retain) UILabel *questionTitle; 
@property (nonatomic, retain) UILabel *inputLabel; 
@property (nonatomic, retain) Question *question; 
@property (nonatomic, retain) UITextField *inputAnswer; 

- (void) addButton:(id)sender isLast:(BOOL)last; 
- (void) setQuestionId:(NSString*)quId withTitle:(NSString*)quTitle number:(NSString*)quNum section:(NSString*)sId questionType:(NSString*)qt; 

@end 

私は.mファイル内Question* question合成:私は、次のクラスの型質問の性質を持っている

#import <Foundation/Foundation.h> 
#import "Answer.h" 

@interface Question : NSObject { 
    NSString* qId; 
    NSString* qTitle; 
    NSString* qNumber; 
    NSString* sectionId; 
    NSString* qType; 
    Answer* answer; 
} 

@property (nonatomic, retain) NSString* qId; 
@property (nonatomic, retain) NSString* qTitle; 
@property (nonatomic, retain) NSString* qNumber; 
@property (nonatomic, retain) NSString* sectionId; 
@property (nonatomic, retain) NSString* qType; 
@property (nonatomic, retain) Answer* answer; 

#import "Question.h" 

@implementation Question 
@synthesize qId, qTitle, qNumber, sectionId, qType, answer; 

-(id)init 
{ 
    if (self = [super init]) 
    { 
     // Initialization code here 
     answer = [[Answer alloc]init]; 
    } 
    return self; 
} 

-(void) dealloc{ 
    [answer release]; 
    [super dealloc]; 
} 

@end 

:私は、次のクラスがあります。私QuestionnaireVieControllerクラスで

:私は次の手順を実行すると

//assigns JSON to question objects 
-(void) setQuestions { 
    questionArray = [[NSMutableArray alloc] init]; 
    for (NSDictionary *q in self.questions) {    
     /* Create Question object and populate it */ 

     id question; 
     if([[q objectForKey:@"type"] isEqualToString:@"Slider"]){ 
      question = [[SliderQuestionViewController alloc]init];    
      //set min max values 
     }else if([[q objectForKey:@"type"] isEqualToString:@"Option"]){ 

     }else if([[q objectForKey:@"type"] isEqualToString:@"TextInput"]){ 
      question = [[TextInputQuestionViewController alloc]init];      
     }else if([[q objectForKey:@"type"] isEqualToString:@"ImagePicker"]){ 

     }else{ 
      //comments   
     } 
     [questionArray addObject:question]; 
     [question setQuestionId:[q objectForKey:@"questionId"] withTitle:[q objectForKey:@"question"] number:[q objectForKey:@"questionNumber"] section:[q objectForKey:@"sectionId"] questionType: [q objectForKey:@"type"]]; 
     [question release]; 

    } 
} 

#import <UIKit/UIKit.h> 
#import "JSONKit.h"; 
#import "dbConnector.h" 
#import "SliderQuestionViewController.h"; 
#import "TextInputQuestionViewController.h"; 
#import "MainMenuProtocol.h"; 

@interface QuestionnaireViewController : UIViewController { 
    NSDictionary* questions; 
    NSMutableArray* questionArray; 
    NSMutableArray* answerArray; 
    dbConnector* db; 
    NSInteger currQNum; 
    NSString* qaTitle; 
    NSString* secId; 
    id<MainMenuProtocol>delegate; 
} 

@property(nonatomic, retain) NSDictionary* questions; 
@property(nonatomic, retain) NSMutableArray* questionArray; 
@property(nonatomic, retain) NSMutableArray* answerArray; 
@property(nonatomic, retain) dbConnector* db; 
@property(nonatomic) NSInteger currQNum; 
@property(nonatomic, retain) NSString* qaTitle; 
@property(nonatomic, retain) NSString* secId; 
@property(nonatomic, retain) id <MainMenuProtocol> delegate; 

-(void) setQuestions; 
-(void) startQuestion:(NSInteger)index isLast:(BOOL)last; 
-(void) loadQuestions; 
-(void) initialise; 
-(void) finishQuestionnaire:(id)sender; 
-(void) switchViews:(id)sender; 

@end 

私はViewControllerを異なる種類のquestionArrayを移入する.mファイルに次のメソッドを使用します.mファイル:

NSLog(@"%@", [questionArray objectAtIndex:0]); 

私は:

<TextInputQuestionViewController: 0x6062e90> 

私がやろう:

NSLog(@"%@", [questionArray objectAtIndex:0].question); 

私はエラーを取得する:

request for member 'question' in something not a structure or union 

地球上で、それは質問の変数にアクセスできないのはなぜ?特に実際にコントローラオブジェクトを記録するとき。私はここに何かを逃しています...

答えて

0

あなたはドット表記である狂気に走っています。これにそれを切り替え、私はそれが動作賭け(または少なくともあなたが有益なエラーが発生します):

NSLog(@"%@", [[questionArray objectAtIndex:0] question]); 

ドット表記があるObjC2でさらにオン平手打ち、およびコンパイラは常にそれを把握することはできません特にidobjectAtIndex:が返す)にメッセージを渡そうとしているときは、コンパイラは混乱して、これはあなたが変装のメッセージではなくstructのために使うドットだと考えています。


EDIT

foo.bar = baz; 
=> [foo setBar:baz]; 

foo.bar.baz 
=> [[foo bar] baz]; 

これは、ところで、実際のObjective-Cです。ドット表記法はこれを書いているちょっとした方法です。特に、foo.bar=bazであり、正確にはであることを理解することが重要です。setBar:fooに送信してください。そのためのデフォルトの振る舞いは、宣言されたセッターセマンティクスを使ってプロパティを割り当てることですが、それは単にデフォルトです。 setBar:を上書きして何かを行うことができます。 setBar:メソッドを呼び出さないようにメッセージディスパッチシステムを再構成することもできます(これはあいまいな機能ではなく、Core DataおよびCore Animationで使用されています)。 Objective-Cは動的言語であり、残念なことにドット表記法はJavaのように見せかけることでこれを泥まませる傾向があります。

+0

OKので、どのように私はその値にオブジェクトのプロパティを割り当てていますか?例えばquestion.id = qId; – user559142

+0

また、オブジェクト内のオブジェクト内のオブジェクトをどのように参照するのですか? – user559142

0

Questionオブジェクトを参照するだけであれば、例えばQuestionオブジェクトを含むQuestionViewControllerクラスを定義し、SliderQuestionViewControllerとTextInputQuestionViewControllerの両方でこのクラスを継承することができます。型QuestionViewControllerのオブジェクトにダウンキャストすることができます

Question * q = ((QuestionViewController *)[questionArray objectAtIndex:0]).question; 
q.id = qId; 
NSLog(@"%@", q.qId); 

またはあなたは、単に書くことができます。

Question * q = (Question*)[[questionArray objectAtIndex:0] question]; 
q.id = qId; 
NSLog(@"%@", q.qId); 
+0

2番目の例では、キャストは不要です。 –

0

はあなたのビューコントローラにQuestion.hが含まれていますか?

すなわち

#include "Question.h" 
関連する問題