Mercurial > hg > soniczoomios
view QuestionnaireViewController.mm @ 49:178642d134a7 tip
xtra files
author | Robert Tubb <rt300@eecs.qmul.ac.uk> |
---|---|
date | Wed, 01 May 2013 17:34:33 +0100 |
parents | 0d3a993405e4 |
children |
line wrap: on
line source
// // QuestionnaireViewController.m // oscSenderExample // // Created by Robert Tubb on 16/01/2013. // // #import "QuestionnaireViewController.h" #import "testApp.h" #pragma mark - #pragma mark QuestionnaireViewController @interface QuestionnaireViewController () // the "model" is an array of questions @property (strong, nonatomic) NSArray * questionArray; @property (nonatomic) NSInteger currentQuestionIndex; @property (nonatomic, assign) id theOFAppRef; /* */ @end @implementation QuestionnaireViewController @synthesize picker; @synthesize nextButton = _nextButton; @synthesize questionArray = _questionArray; //---------------------------------------------------------------- - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; if (self) { // Custom initialization [self populateQuestionArray ]; } return self; } - (void)setAppRef:(id)theOFApp{ self.theOFAppRef = theOFApp; } //---------------------------------------------------------------- - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view from its nib. self.currentQuestionIndex = 0; // load question 1 [self loadQuestion:self.currentQuestionIndex]; self.previousButton.hidden = NO; // bother self.commentText.hidden = YES; self.finishButton.hidden = YES; self.nextButton.hidden = YES; self.lickertOptions.hidden = NO; self.interfacePreferenceOptions.hidden = YES; } //---------------------------------------------------------------- - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } //---------------------------------------------------------------- - (void)dealloc { [super dealloc]; } //---------------------------------------------------------------- - (void)viewDidUnload { [self.questionArray release]; [self setQuestionText:nil]; [self setTitleText:nil]; [self setFinishButton:nil]; [self setNextButton:nil]; [self setPreviousButton:nil]; [self setCommentText:nil]; [self setNumberChooser:nil]; [self setInterfacePreferenceOptions:nil]; [self setLickertOptions:nil]; [self setPleaseAnswer:nil]; [super viewDidUnload]; } //---------------------------------------------------------------- -(IBAction)hide:(id)sender{ // called when finish button hit // c++ call with NSArray argument?? // load answers into a c++ vector; vector<int> answersArray; Question *q; for(int i=0;i<[self.questionArray count];i++){ q = [self.questionArray objectAtIndex:i]; answersArray.push_back(q.answer); } const char *userComments = [self.commentText.text cStringUsingEncoding: NSUTF8StringEncoding]; [self.commentText resignFirstResponder]; self.view.hidden = YES; ((testApp *)self.theOFAppRef)->questionnaireHidden(answersArray, userComments); } //---------------------------------------------------------------- -(IBAction)show:(id)sender{ self.view.hidden = NO; } //---------------------------------------------------------------- - (IBAction)nextQuestionPressed:(id)sender { // save answer ? no button did that hopefully // if last question show thanks // else go to next self.currentQuestionIndex++; if(self.currentQuestionIndex >= [self.questionArray count]){ [self showThanks]; }else{ [self loadQuestion:self.currentQuestionIndex]; } } //---------------------------------------------------------------- - (IBAction)previousQuestionPressed:(id)sender { self.currentQuestionIndex--; if(self.currentQuestionIndex < 0){ // nothing self.currentQuestionIndex = 0; }else{ [self loadQuestion:self.currentQuestionIndex]; } } //---------------------------------------------------------------- - (void)showThanks{ // hide next question button self.nextButton.hidden = YES; // hide selector self.picker.hidden = YES; self.previousButton.hidden = YES; self.finishButton.hidden = NO; self.lickertOptions.hidden = YES; self.interfacePreferenceOptions.hidden = YES; self.titleText.text = @"Thank you!"; self.numberChooser.hidden = YES; self.commentText.hidden = NO; self.questionText.text = @"Thanks for helping science help you. Feel free to add further comments in the text box below, and then press 'finish' to go back and use the app."; } //---------------------------------------------------------------- - (void)loadQuestion:(NSInteger)questionIndex { // populate text fields with question NSString *qtitle; qtitle = [@"Question " stringByAppendingFormat:@"%d / %d",questionIndex+1, [self.questionArray count]]; self.titleText.text = qtitle; Question *curQ = [self.questionArray objectAtIndex:self.currentQuestionIndex]; self.questionText.text = curQ.questionText; // refresh picker view content //[picker reloadComponent:0]; // show correct option number labels if(curQ.questionType == AGREE_DISAGREE){ self.lickertOptions.hidden = NO; self.interfacePreferenceOptions.hidden = YES; }else if(curQ.questionType == SLIDERS_ZOOMER){ self.lickertOptions.hidden = YES; self.interfacePreferenceOptions.hidden = NO; } //NSLog(@"Prev answer answerInt %d", curQ.answer); //[picker selectRow:2 inComponent:0 animated:YES]; // what about unselecting segment? } // 1/3/13 removed q 6 and 15. now only 15 qs //---------------------------------------------------------------- - (void)populateQuestionArray{ // potential leak self.questionArray = [NSArray arrayWithObjects: [[Question alloc] initWithTextAndType:@"I am familiar with music software and sound synthesis.":AGREE_DISAGREE], [[Question alloc] initWithTextAndType:@"The ability to retrace my steps using the history path was useful...":AGREE_DISAGREE], [[Question alloc] initWithTextAndType:@"The best interface for discovering interesting sounds quickly was...":SLIDERS_ZOOMER], [[Question alloc] initWithTextAndType:@"The best interface for fine tuning a sound was...":SLIDERS_ZOOMER], [[Question alloc] initWithTextAndType:@"The correspondence between the sliders and the grid was understandable.":AGREE_DISAGREE], [[Question alloc] initWithTextAndType:@"Scrolling a greater distance on the grid seemed to correspond to larger difference in the sound.":AGREE_DISAGREE], [[Question alloc] initWithTextAndType:@"The interface that I felt more in control using was...":SLIDERS_ZOOMER], [[Question alloc] initWithTextAndType:@"Being able to see previously saved presets laid on the grid is useful.":AGREE_DISAGREE], // [[Question alloc] initWithTextAndType:@"The interface that felt more creative was...":SLIDERS_ZOOMER], [[Question alloc] initWithTextAndType:@"The range of sounds was too limited to be able to judge the eventual usefulness of the interface.":AGREE_DISAGREE], [[Question alloc] initWithTextAndType:@"The interface better for generating new ideas was...":SLIDERS_ZOOMER], [[Question alloc] initWithTextAndType:@"The interface better for performing live would be...":SLIDERS_ZOOMER], [[Question alloc] initWithTextAndType:@"The Zoomer was an improvement on just using a randomiser.":AGREE_DISAGREE], [[Question alloc] initWithTextAndType:@"The combination of Zoomer and Sliders was better than either individually.":AGREE_DISAGREE], [[Question alloc] initWithTextAndType:@"I enjoy 'happy accidents' in the creative process.":AGREE_DISAGREE], [[Question alloc] initWithTextAndType:@"Overall, the interface I preferred using was...":SLIDERS_ZOOMER], // ?????? nil]; // The zoomer seemed more appropriate to explore the synth sound controls (red) than the note sequence controls (blue) // I enjoyed the sounds produced } //---------------------------------------------------------------- #pragma mark - #pragma mark PickerView DataSource - (NSInteger)numberOfComponentsInPickerView: (UIPickerView *)pickerView { return 1; } //---------------------------------------------------------------- - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { return NUM_CHOICES; // always 6 } //---------------------------------------------------------------- - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component { Question *curQ = [self.questionArray objectAtIndex:self.currentQuestionIndex]; // get array of answers from Question class NSArray * answers = [Question answersWithType:curQ.questionType]; return [answers objectAtIndex:row]; } //---------------------------------------------------------------- #pragma mark - #pragma mark PickerView Delegate -(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { Question *curQ = [self.questionArray objectAtIndex:self.currentQuestionIndex]; // set question answerArray curQ.answer = row; // chek wot we just rote NSLog(@"Answer: %d",curQ.answer); } //---------------------------------------------------------------- #pragma mark UITextViewDelegate functions /* This answer was useful to me, but I was also looking for the callback function from the "Go" button, which I found is: - (BOOL) textFieldShouldReturn:(UITextField *)textField { // Customer code return YES; } You will need to send the UITextField delegate to your view controller for that to work. */ - (BOOL) textFieldShouldReturn:(UITextField *)textField { // Customer code NSLog(@"RETURN DELEGATE"); [self hide:self ]; return NO; } - (IBAction)answerChosen:(id)sender { self.pleaseAnswer.hidden = YES; UISegmentedControl *seg = (UISegmentedControl *)sender; Question *curQ = [self.questionArray objectAtIndex:self.currentQuestionIndex]; // set question answerArray curQ.answer = seg.selectedSegmentIndex; // chek wot we just rote NSLog(@"Answer: %d",curQ.answer); // automatically go next q self.currentQuestionIndex++; if(self.currentQuestionIndex >= [self.questionArray count]){ [self showThanks]; }else{ [self loadQuestion:self.currentQuestionIndex]; } } @end // end implementation //---------------------------------------------------------------- //----------------------------------------------------------------