Ios 委托方法未被调用或调用时未触发

Ios 委托方法未被调用或调用时未触发,ios,objective-c,delegates,protocols,Ios,Objective C,Delegates,Protocols,我正在尝试实现两个委托方法。我认为我正确地编写了协议,并且正确地分配了代理,因为我仔细地在另一个工作正常的代理/协议上建模。然而,委托方法在被调用时不会触发,或者至少看起来是这样。我已经在调用委托方法的地方设置了断点,也在方法本身设置了断点,但似乎控制从未到达它们 以下是我认为相关的代码。从notifyingVC.h文件: // AddCategoryVC.h // YYYYYY // // Created by XXXXXX on 2/19/15. // Copyright (c) 2

我正在尝试实现两个委托方法。我认为我正确地编写了协议,并且正确地分配了代理,因为我仔细地在另一个工作正常的代理/协议上建模。然而,委托方法在被调用时不会触发,或者至少看起来是这样。我已经在调用委托方法的地方设置了断点,也在方法本身设置了断点,但似乎控制从未到达它们

以下是我认为相关的代码。从notifyingVC.h文件:

//  AddCategoryVC.h
//  YYYYYY
//
//  Created by XXXXXX on 2/19/15.
//  Copyright (c) 2015 XXXXXX. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "WMMGCategory.h"
//#import "AddTransactionVC.h"

@class AddTransactionVC;

@protocol AddCategoryDelegate <NSObject>

-(void) addCategoryDidSave : (WMMGCategory *) brandNewCategory;

-(void) addCategoryDidCancel : (WMMGCategory *) categoryToDelete;

@end

@interface AddCategoryVC : UIViewController

@property (nonatomic, weak) id <AddCategoryDelegate> delegate;
//
//  AddTransactionVC.h
//  YYYYYY
//
//  Created by XXXXXX on 2/6/15.
//  Copyright (c) 2015 XXXXXX. All rights reserved.
//

#import <UIKit/UIKit.h>
#import <MagicalRecord/CoreData+MagicalRecord.h>

#import "WMMGTransaction.h"
#import "AddCategoryVC.h"
#import "WMMGCategory.h"
最后,从DelegateVC.m文件中,委托方法本身:

#pragma mark - New category delegate methods

-(void)addCategoryDidSave:(WMMGCategory *)brandNewCategory
{
    NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread];
    [localContext MR_saveToPersistentStoreAndWait];
    [self.navigationController dismissViewControllerAnimated:YES completion:nil];
}

-(void)addCategoryDidCancel:(WMMGCategory *)categoryToDelete
{
    [categoryToDelete MR_deleteEntity];
    [self.navigationController dismissViewControllerAnimated:YES completion:nil];

}
我承认我可能犯了一些愚蠢的错误,但我很感激有人能看看我做错了什么

根据@rdelmar下面的回答进行编辑:

下面是AddCategoryVC实例的创建代码:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSString *identifier = segue.identifier;

    if ([identifier isEqualToString:@"CatSelectSegue"])
    {
        UIViewController *dvc = segue.destinationViewController;
        UIPopoverPresentationController *catSelPPC = dvc.popoverPresentationController;
        if (catSelPPC)
        {
            catSelPPC.delegate = self;
        }
    }

    else if ([identifier isEqualToString:@"newCatSegue"])
    {
        UIViewController *dvc = segue.destinationViewController;
        UIPopoverPresentationController *catNewPPC = dvc.popoverPresentationController;


        NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread];

        if ([[segue identifier] isEqualToString:@"newTransSegue"])
        {
            UINavigationController *navController = (UINavigationController *)segue.destinationViewController;
            AddCategoryVC *addCatVC = (AddCategoryVC *)navController.topViewController;
            addCatVC.delegate = self;
            WMMGCategory *addedCategory = (WMMGCategory *)[WMMGCategory MR_createInContext:localContext];
            addCatVC.brandNewCategory = addedCategory;
        }

        if (catNewPPC)
        {
            catNewPPC.delegate = self;
        }
    }

}

您的问题是,您正在viewDidLoad中创建的AddCategoryVC实例不是屏幕上的实例(您从未对其执行任何操作,因此它将在viewDidLoad超出范围后立即解除分配)。您需要获取对已有实例的引用。在不知道控制器的制作位置以及它们如何出现在屏幕上的情况下,我无法具体说明如何执行此操作。

请参阅编辑创建代码。我想我看到了一个问题(或者至少不是一个解决方案),在这个问题中,我一创建“self”就将其指定为代理。不知道如何获得参考。如果你需要更多信息,请告诉我。谢谢@Crattrap99,你在prepareForSegue中的做法看起来是正确的。您正在使用AddCategoryVC*addCatVC=(AddCategoryVC*)navController.topViewController获取引用。那代码是哪一类的?对不起,我得离开几分钟。该代码位于AddTransactionVC.m(委托类)中。这就是激活按钮的位置,顺便说一句。@Crattrap99,好的,我没有看到任何错误。如果在AddCategoryVC中的cancelCategory:方法中记录self.delegate,它是否会向您显示应该是委托的AddTransactionVC实例?我刚刚发现了问题。看看PrepareForsgue里写着“newCatSegue”的地方?它应该在嵌套的if中说同样的话,但改为“newTransSegue”。我改变了它,现在它似乎起作用了。第二个问题是为什么我有嵌套的if作为开始,所以我们也将研究它。万分感谢!修复是一种外围的,但是如果你的回答没有让我看到prepareForSegue方法,我不知道什么时候我会找到解决方案。接受并投票!
#pragma mark - New category delegate methods

-(void)addCategoryDidSave:(WMMGCategory *)brandNewCategory
{
    NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread];
    [localContext MR_saveToPersistentStoreAndWait];
    [self.navigationController dismissViewControllerAnimated:YES completion:nil];
}

-(void)addCategoryDidCancel:(WMMGCategory *)categoryToDelete
{
    [categoryToDelete MR_deleteEntity];
    [self.navigationController dismissViewControllerAnimated:YES completion:nil];

}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSString *identifier = segue.identifier;

    if ([identifier isEqualToString:@"CatSelectSegue"])
    {
        UIViewController *dvc = segue.destinationViewController;
        UIPopoverPresentationController *catSelPPC = dvc.popoverPresentationController;
        if (catSelPPC)
        {
            catSelPPC.delegate = self;
        }
    }

    else if ([identifier isEqualToString:@"newCatSegue"])
    {
        UIViewController *dvc = segue.destinationViewController;
        UIPopoverPresentationController *catNewPPC = dvc.popoverPresentationController;


        NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread];

        if ([[segue identifier] isEqualToString:@"newTransSegue"])
        {
            UINavigationController *navController = (UINavigationController *)segue.destinationViewController;
            AddCategoryVC *addCatVC = (AddCategoryVC *)navController.topViewController;
            addCatVC.delegate = self;
            WMMGCategory *addedCategory = (WMMGCategory *)[WMMGCategory MR_createInContext:localContext];
            addCatVC.brandNewCategory = addedCategory;
        }

        if (catNewPPC)
        {
            catNewPPC.delegate = self;
        }
    }

}