代码之家  ›  专栏  ›  技术社区  ›  JRulle

解除多个视图控制器的委派问题

  •  0
  • JRulle  · 技术社区  · 12 年前

    我之前问过一个关于解雇多个视图控制器的问题,得到的答案以及我在其他地方找到的可能解决方案都未能达到预期效果。我已经把我的问题缩小到我组建代表团的方式上。代码如下,如果有任何反馈,我将不胜感激。

    我的完整项目可以在这里下载: 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
    
    1 回复  |  直到 12 年前
        1
  •  1
  •   user523234    12 年前

    在prepareForSegue方法中,您漏掉了这一行:

    avc.delegate=自我;