这是我的代码。 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)对象的代码中没有看到任何地方。所以,有几件事可以尝试:
- 确保分配委托(delegate)(AddItemViewController instance.delegate = ChecklistViewController instance)
- 确保其他东西引用了您的 ChecklistViewController,这样它就不会在您需要时消失。
关于ios - 为什么我的自定义委托(delegate)在 Objective-C 中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34803092/