Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何将方法移出应用程序委派?_Objective C_Uiviewcontroller_Uiapplicationdelegate - Fatal编程技术网

Objective c 如何将方法移出应用程序委派?

Objective c 如何将方法移出应用程序委派?,objective-c,uiviewcontroller,uiapplicationdelegate,Objective C,Uiviewcontroller,Uiapplicationdelegate,我试图将方法移出app delegate,而是使用一个单独的视图控制器来遵守协议。 旧的应用程序委托是: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.qnaire = [[VRQuestionnaire alloc] initWithFile:[[NSBundle mainBundle] pat

我试图将方法移出app delegate,而是使用一个单独的视图控制器来遵守协议。 旧的应用程序委托是:

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.qnaire = [[VRQuestionnaire alloc] initWithFile:[[NSBundle mainBundle] pathForResource:@"set1"
                                                                                        ofType:@"json"]];

    self.navController = (UINavigationController *)self.window.rootViewController;
    [self prepareForQuestion:self.qnaire.firstQuestion animated:NO];

    return YES;
}

/* Set up the question view controller with a question and push onto the nav stack
 */
- (void)prepareForQuestion:(VRQuestion *)question animated:(BOOL)animated;
{
    VRQuestionViewController *qvc = (VRQuestionViewController *)[self.navController.storyboard instantiateViewControllerWithIdentifier:@"QuestionViewController"];
    qvc.delegate = self;

    qvc.question = question;
    [self.navController pushViewController:qvc animated:animated];
}

/* Delegate that gets called every time a question is answered. This loads the next question and pushes it onto the nav stack.
 It also pushes a pointer to the question and result to a linked-list called firstAnswer->nextAnswer->nextAnswer, etc.

 When the next question returns nil we know we've finished as there are no more questions and log linked-list to console.
 */
- (void)questionViewController:(VRQuestionViewController *)controller didAnswerQuestion:(VRQuestion *)question withResult:(BOOL)result
{
    VRQuestion *nextQuestion = nil;

    if (result == YES) {
        nextQuestion = question.nextYesQuestion;
    } else if (result == NO) {
        nextQuestion = question.nextNoQuestion;
    }
    [self.qnaire pushAnswerResult:result forQuestion:question];

    // Handle no more questions
    if(nextQuestion) {
        [self prepareForQuestion:nextQuestion animated:YES];

    } else {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Complete"
                                                            message:@"You completed the questionnaire"
                                                           delegate:nil
                                                  cancelButtonTitle:@"OK"
                                                  otherButtonTitles:nil];
        [alertView show];
        [self.qnaire logAnswers];
    }
}
我试图将这些方法移动到InitialViewController,但按钮什么也不做

@implementation InitialViewController
- (IBAction)buttonPress:(UIButton *)sender {

    self.qnaire = [[VRQuestionnaire alloc] initWithFile:[[NSBundle mainBundle] pathForResource:@"set1"
                                                                                        ofType:@"json"]];
    //self.navController = (UINavigationController *)self.window.rootViewController;
    [self prepareForQuestion:self.qnaire.firstQuestion animated:NO];

}
提前谢谢

InitialViewController按钮应调用下面给出的VRQuestionViewController

@interface VRQuestionViewController ()

@end

@implementation VRQuestionViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];


    self.label.text = self.question.text;
    self.title = [self.question.identifier uppercaseString];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)yesPressed:(id)sender
{
    if (self.delegate != nil) {
        if ([self.delegate respondsToSelector:@selector(questionViewController:didAnswerQuestion:withResult:)]) {
            [self.delegate questionViewController:self didAnswerQuestion:self.question withResult:YES];
        }
    }
}

- (IBAction)noPressed:(id)sender
{
    if (self.delegate != nil) {
        if ([self.delegate respondsToSelector:@selector(questionViewController:didAnswerQuestion:withResult:)]) {
            [self.delegate questionViewController:self didAnswerQuestion:self.question withResult:NO];
        }
    }
}

@end
我当前的AppDelegate:

#import <UIKit/UIKit.h>
#import "VRQuestionnaire.h"
#import "VRQuestionViewController.h"

@interface VRAppDelegate : UIResponder <UIApplicationDelegate>


@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) VRQuestionnaire *qnaire;


@end



#import "VRAppDelegate.h"
#import "VRQuestionViewController.h"

@implementation VRAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    self.qnaire = [[VRQuestionnaire alloc] initWithFile:[[NSBundle mainBundle] pathForResource:@"set1"
                                                                                        ofType:@"json"]];


    return YES;
}
让CTRL键从导航控制器拖动以使InitialViewController成为根视图控制器。 CTRL从按钮拖动到视图控制器

在模拟器中,当按下按钮时,显示控制器,没有问题或对Y/N的响应


对不起,如果这是真的,我会做个猪耳朵

所讨论的代码似乎是Github上的示例代码,列在

为了可读性,相当多的逻辑发生在app委托中。应用程序代表初始化VRQ实例并设置问题。然后在导航控制器上设置第一个问题视图控制器。每个VRQuestionViewController都已配置,因此应用程序代理也是VRQuestionViewController代理。回答一个问题后,它会回调questionViewController:didAnswerQuestion:withResult:应用程序代表将结果推送到问卷的答案列表上,然后沿着问题树移动以显示下一个问题

正如Wain所建议的,如果您想将其扩展到一个以上的示例,您可能会将app delete代码移动到控制器类中。您的初始视图控制器类遇到问题,因为所有内容都包装在导航控制器中,因此您的导航控制器应该是故事板中的初始视图控制器,而InitialViewController类则是导航控制器的根视图控制器。您可以通过右键单击从情节提要中的导航控制器拖动到InitialViewController来完成此操作


希望有帮助

为什么是视图控制器?看起来你应该有一个问题或调查问卷。假设您当前的问题是self.navController为零?确切地说,self.navController为零。。我卡住了!InitialViewController是您导航控制器中的根视图控制器吗?我有一个导航控制器标记为初始视图控制器刚刚删除了它,所以InitialViewController在情节提要中标记为初始视图控制器-虽然有帮助,但仍然缺少一些内容-已更新我的question@Wain我已经准备好了InitialViewController作为根控制器,正如您和@Electron所建议的那样。我发现qvc返回nil,而在原始代码中它是VRQuestionViewController的一个实例。-void prepareforquestion:VRQuestion*问题动画:BOOLanimated;{VRQuestionViewController*qvc=VRQuestionViewController*[self.navController.storyboard InstanceeviewController标识符:@QuestionViewController];qvc.delegate=self;qvc.question=question;//qvc nil[self.navController pushViewController:qvc动画:动画];}
#import "VRAppDelegate.h"
#import "VRQuestionViewController.h"

@implementation VRAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    self.qnaire = [[VRQuestionnaire alloc] initWithFile:[[NSBundle mainBundle] pathForResource:@"set1"
                                                                                        ofType:@"json"]];


    return YES;
}

#import "InitialViewController.h"

@interface InitialViewController ()

@end

@implementation InitialViewController
- (IBAction)buttonPress:(UIButton *)sender {

    self.qnaire = [[VRQuestionnaire alloc] initWithFile:[[NSBundle mainBundle] pathForResource:@"set1"
                                                                                        ofType:@"json"]];

    self.navController = (UINavigationController *)self.window.rootViewController;

    [self prepareForQuestion:self.qnaire.firstQuestion animated:NO];


}



/* Set up the question view controller with a question and push onto the nav stack
 */
- (void)prepareForQuestion:(VRQuestion *)question animated:(BOOL)animated;
{
    VRQuestionViewController *qvc = (VRQuestionViewController *)[self.navController.storyboard instantiateViewControllerWithIdentifier:@"QuestionViewController"];
    qvc.delegate = self;

    qvc.question = question;
    [self.navController pushViewController:qvc animated:animated];
}

/* Delegate that gets called every time a question is answered. This loads the next question and pushes it onto the nav stack.
 It also pushes a pointer to the question and result to a linked-list called firstAnswer->nextAnswer->nextAnswer, etc.

 When the next question returns nil we know we've finished as there are no more questions and log linked-list to console.
 */
- (void)questionViewController:(VRQuestionViewController *)controller didAnswerQuestion:(VRQuestion *)question withResult:(BOOL)result
{
    VRQuestion *nextQuestion = nil;

    if (result == YES) {
        nextQuestion = question.nextYesQuestion;
    } else if (result == NO) {
        nextQuestion = question.nextNoQuestion;
    }
    [self.qnaire pushAnswerResult:result forQuestion:question];

    // Handle no more questions
    if(nextQuestion) {
        [self prepareForQuestion:nextQuestion animated:YES];

    } else {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Complete"
                                                            message:@"You completed the questionnaire"
                                                           delegate:nil
                                                  cancelButtonTitle:@"OK"
                                                  otherButtonTitles:nil];
        [alertView show];
        [self.qnaire logAnswers];
    }
}



- (void)viewDidLoad {
    [super viewDidLoad];

    // Do any additional setup after loading the view from its nib.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

@end