以前に複数のView Controllerを閉じることについて質問しましたが、他の場所で見つけた可能な解決策とともに与えられた回答はすべて、望ましい効果を達成できませんでした. 委任を設定する方法で問題を絞り込みました。コードを以下に示します。フィードバックをいただければ幸いです。
私の完全なプロジェクトはここからダウンロードできます: https://www.yousendit.com/download/TEhWckhYQVNYSHpIRHNUQw
ありがとう。
//
// QuestionViewController.h
// learningTheRopes1
//
// Created by James Ulle on 7/18/12.
// Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "Question.h"
#import "AnswerViewController.h"
@interface QuestionViewController : UIViewController <AnswerViewControllerDelegate>
@property (weak, nonatomic) IBOutlet UILabel *currentQuestionDisplay;
@property (weak, nonatomic) IBOutlet UITextField *userAnswerTextField;
@property (nonatomic, strong) Question *currentQuestion;
- (IBAction)dismissKeyboard:(id)sender;
- (void)dismissQVC;
@end
//
// QuestionViewController.m
// learningTheRopes1
//
// Created by James Ulle on 7/18/12.
// Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import "QuestionViewController.h"
@interface QuestionViewController ()
@end
@implementation QuestionViewController
@synthesize currentQuestionDisplay;
@synthesize userAnswerTextField;
@synthesize currentQuestion;
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
AnswerViewController *avc = [segue destinationViewController];
[avc setCurrentQuestion:currentQuestion];
[avc setUserAnswer:[userAnswerTextField text]];
}
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
[self.currentQuestionDisplay setText:[currentQuestion question]];
// Do any additional setup after loading the view.
}
- (void)viewDidUnload
{
[self setCurrentQuestionDisplay:nil];
[self setUserAnswerTextField:nil];
[super viewDidUnload];
// Release any retained subviews of the main view.
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
- (IBAction)dismissKeyboard:(id)sender {
[userAnswerTextField resignFirstResponder];
}
- (void)dismissQVC {
NSLog(@"Dismiss QVC");
[self.navigationController popViewControllerAnimated:NO];
}
@end
//
// AnswerViewController.h
// learningTheRopes1
//
// Created by James Ulle on 7/18/12.
// Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import <UIKit/UIKit.h>
#import "Question.h"
@protocol AnswerViewControllerDelegate <NSObject>
- (void)dismissQVC;
@end
#import "QuestionViewController.h"
@interface AnswerViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *displayCurrentAnswer;
@property (nonatomic, strong) Question *currentQuestion;
@property (nonatomic, strong) NSString *userAnswer;
@property (nonatomic, weak) id <AnswerViewControllerDelegate> delegate;
- (IBAction)dismissAnswerVC:(id)sender;
@end
//
// AnswerViewController.m
// learningTheRopes1
//
// Created by James Ulle on 7/18/12.
// Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//
#import "AnswerViewController.h"
@interface AnswerViewController ()
@end
@implementation AnswerViewController
@synthesize displayCurrentAnswer;
@synthesize currentQuestion;
@synthesize userAnswer;
@synthesize delegate;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
if([userAnswer isEqualToString:currentQuestion.answer]) {
[self.displayCurrentAnswer setText:@"You are correct!"];
}
else {
[self.displayCurrentAnswer setText:@"You are wrong!"];
}
// Do any additional setup after loading the view.
}
- (void)viewDidUnload
{
[self setDisplayCurrentAnswer:nil];
[super viewDidUnload];
// Release any retained subviews of the main view.
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
- (IBAction)dismissAnswerVC:(id)sender {
[self dismissViewControllerAnimated:YES completion:^{
NSLog(@"Dismiss AVC");
[[self delegate] dismissQVC];
}];
}
@end
最後に、私の出力は次のとおりです (これは、完了ブロックが実際に呼び出されたことを示していますが、dimissQVC へのデリゲート コールバックは発生しません。
2012-08-03 19:04:34.235
learningTheRopes1[4165:f803] Dismiss AVC