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

iOS委派取消呼叫失败

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

    我有两个视图控制器, HomeViewController AddViewController . 家庭视图控制器 是的代表 添加视图控制器 .

    问题是当我按下 添加视图控制器 ,对委托的调用似乎没有执行。有症状的是,“取消”按钮的行为就像它甚至没有连接一样。在编程上,断点似乎表明控件离开 cancelButton 方法,但从未达到 addViewControllerDidCancel .

    我相信一切都连接正确,下面是相关代码:

    从AddViewController.h:

    #import <UIKit/UIKit.h>
    #import "WMDGCategory.h"
    #import "WMDGActivity.h"
    @class HomeViewController;
    
    
    @protocol AddViewControllerDelegate <NSObject>
    
    -(void) addViewControllerDidSave;
    
    -(void) addViewControllerDidCancel:(WMDGActivity *) activityToDelete;
    
    @end
    
    @interface AddViewController : UIViewController <UIPickerViewDataSource,UIPickerViewDelegate>
    
    
    @property (nonatomic, weak) id <AddViewControllerDelegate> delegate;
    

    从HomeViewController.h:

    @interface HomeViewController : UITableViewController <UITableViewDataSource,UITableViewDelegate,AddViewControllerDelegate>
    

    从HomeViewController.m:

    -(void) addViewControllerDidSave
    {
        NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread];
        [localContext MR_saveToPersistentStoreAndWait];
        [self.navigationController dismissViewControllerAnimated:YES completion:nil];
        [self refreshData];
    
    }
    
    -(void) addViewControllerDidCancel:(WMDGActivity *) activityToDelete
    {
        [activityToDelete MR_deleteEntity];
        [self.navigationController dismissViewControllerAnimated:YES completion:nil];
        [self refreshData];
    
    }
    

    从AddViewController.m:

    - (IBAction)cancelButton:(UIBarButtonItem *)sender
    {
        [self.delegate addViewControllerDidCancel:self.thisActivity];
    }
    

    有人能发现我的错误吗?

    谢谢

    根据以下答案1进行编辑:

    实际上,我在HomeViewController中的prepareFroSegue方法中这样做了:

    - (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
            NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread];
        if ([[segue identifier] isEqualToString:@"addModal"])
        {
            UINavigationController *navController = (UINavigationController *)segue.destinationViewController;
            AddViewController *avc = (AddViewController *)navController.topViewController;
            avc.delegate = self;
            WMDGActivity *addedActivity = (WMDGActivity *)[WMDGActivity MR_createInContext:localContext];
            avc.thisActivity = addedActivity;
        }
    
    }
    
    1 回复  |  直到 12 年前
        1
  •  3
  •   Merlevede    12 年前

    您缺少分配AddViewController实例的委托对象,从我可以看到它仍然 nil

    myAddViewController.delegate = self;  // 'self' is an example, should be myHomeViewController instance
    

    编辑:
    您正在代码中调用此项:

    [self.delegate addViewControllerDidCancel:self.thisActivity];
    

    问问自己 delegate ? 你已经声明了它,是的,但是你没有设置它的值,所以它必须是 。因此,当您实例化 AddViewController 您必须使用我之前写的行设置代理。