Ios 委托方法未被调用或调用时未触发
我正在尝试实现两个委托方法。我认为我正确地编写了协议,并且正确地分配了代理,因为我仔细地在另一个工作正常的代理/协议上建模。然而,委托方法在被调用时不会触发,或者至少看起来是这样。我已经在调用委托方法的地方设置了断点,也在方法本身设置了断点,但似乎控制从未到达它们 以下是我认为相关的代码。从notifyingVC.h文件: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
// 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;
}
}
}