ios - 为什么我的自定义委托(delegate)在 Objective-C 中不起作用?

标签 ios objective-c

这是我的代码。 AddItemViewController.h:

#import <UIKit/UIKit.h>

@class AddItemViewController, ChecklistItem;
@protocol AddItemViewControllerDelegate <NSObject>
@optional
- (void)addItemViewControllerDidCancel:(AddItemViewController *)controller;
- (void)addItemViewController:(AddItemViewController *)controller didFinishAddingItem:(ChecklistItem *)item;
@end

@interface AddItemViewController : UITableViewController
@property (weak, nonatomic) id<AddItemViewControllerDelegate> delegate;
@end

AddItemViewController.m:

#import "AddItemViewController.h"
#import "ChecklistItem.h"

@interface AddItemViewController () <UITextFieldDelegate>
- (IBAction)Done:(id)sender;
- (IBAction)Cancel:(id)sender;

@end
...
- (IBAction)Done:(id)sender {
    ChecklistItem *item = [[ChecklistItem alloc]init];
    item.text = self.textField.text;
    item.checked = false;

    if ([self.delegate respondsToSelector:@selector(addItemViewController:didFinishAddingItem:)]) {
        [self.delegate addItemViewController:self didFinishAddingItem:item];
    }
}

- (IBAction)Cancel:(id)sender {
    [self.delegate addItemViewControllerDidCancel:self];
}

...

ChecklistViewController 调用委托(delegate)。 ChecklistViewController.m:

#import "ChecklistViewController.h"
#import "ChecklistItem.h"
#import "AddItemViewController.h"

@interface ChecklistViewController () <UITableViewDelegate, UITableViewDataSource, AddItemViewControllerDelegate>
@end

@implementation ChecklistViewController
...
- (void)viewDidLoad {
    [super viewDidLoad];
    AddItemViewController *addItem = [[AddItemViewController alloc]init];
    addItem.delegate = self;    
}
- (void)addItemViewControllerDidCancel:(AddItemViewController *)controller{
    [self dismissViewControllerAnimated:YES completion:nil];
}
- (void)addItemViewController:(AddItemViewController *)controller didFinishAddingItem:(ChecklistItem *)item{
    [self dismissViewControllerAnimated:YES completion:nil];
}
...
@end

我已经调试了应用程序。当 AddItemViewController 运行时,'self.delegate' 为空。任何人都可以告诉我我的代码有什么问题。非常感谢!

最佳答案

代表被弱持有。您已经使用

正确设置了它
@property (weak, nonatomic) id<AddItemViewControllerDelegate> delegate;

但是,由于它是弱持有的,因此必须有其他东西持有对该委托(delegate)对象的引用。

此外,我在您发布的分配委托(delegate)对象的代码中没有看到任何地方。所以,有几件事可以尝试:

  1. 确保分配委托(delegate)(AddItemViewController instance.delegate = ChecklistViewController instance)
  2. 确保其他东西引用了您的 ChecklistViewController,这样它就不会在您需要时消失。

关于ios - 为什么我的自定义委托(delegate)在 Objective-C 中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34803092/

相关文章:

c++ - 是否可以将 C++ 接口(interface)与 Objective-C 一起使用?

ios - 如何在长按上显示用户选择的表格 View 单元格

ios - iPad 应用程序中的旋转

ios - CocoaPods Swift 链接器错误

objective-c - 如何为 Mac 创建 Cocoa 应用程序首选项?

ios - NSString 去掉括号

ios - 将 GCD 与也进行异步调用的代码一起使用是否安全

ios - Swift:在 Safari 中打开 Web View 中的所有外部链接,而不是在 Web View 中

ios - 检查数组值是否等于字符串

ios - HealthKit 权限模式 - 对开始/结束外观转换的不平衡调用