Ios 为什么我的自定义代理没有';你不能在Objective-C中工作吗?
这是我的密码。 AddItemViewController.h:Ios 为什么我的自定义代理没有';你不能在Objective-C中工作吗?,ios,objective-c,Ios,Objective C,这是我的密码。 AddItemViewController.h: #import <UIKit/UIKit.h> @class AddItemViewController, ChecklistItem; @protocol AddItemViewControllerDelegate <NSObject> @optional - (void)addItemViewControllerDidCancel:(AddItemViewController *)controller
#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,ChecklistItem;
@协议AddItemViewControllerDelegate
@可选的
-(void)AddItemViewController IDCancel:(AddItemViewController*)控制器;
-(void)addItemViewController:(addItemViewController*)控制器didFinishAddingItem:(ChecklistItem*)项;
@结束
@接口AddItemViewController:UITableViewController
@属性(弱、非原子)id委托;
@结束
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];
}
...
#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.h”
#导入“ChecklistItem.h”
@接口AddItemViewController()
-(iAction)完成:(id)发送方;
-(iAction)取消:(id)发件人;
@结束
...
-(iAction)完成:(id)发送方{
ChecklistItem*item=[[ChecklistItem alloc]init];
item.text=self.textField.text;
item.checked=false;
if([self.delegate respondsToSelector:@selector(addItemViewController:DidFinishadingItem:)])){
[self.delegate addItemViewController:self-didFinishadingItem:item];
}
}
-(iAction)取消:(id)发件人{
[self.delegate addItemViewControllerIDCancel:self];
}
...
然后ChecklistViewController调用委托。
ChecklistViewController.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];
}
...
#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
#导入“ChecklistViewController.h”
#导入“ChecklistItem.h”
#导入“AddItemViewController.h”
@接口ChecklistViewController()
@结束
@实现ChecklistViewController
...
-(无效)viewDidLoad{
[超级视图下载];
AddItemViewController*addItem=[[AddItemViewController alloc]init];
addItem.delegate=self;
}
-(无效)AddItemViewController IDCancel:(AddItemViewController*)控制器{
[自我解除视图控制器激活:是完成:无];
}
-(void)addItemViewController:(addItemViewController*)控制器didFinishAddingItem:(ChecklistItem*)项{
[自我解除视图控制器激活:是完成:无];
}
...
@结束
我已经调试了应用程序。当AddItemViewController运行时,“self.delegate”为空。任何人都可以告诉我我的代码有什么问题。非常感谢 代表被无力地抓住。您已使用正确的设置
@property (weak, nonatomic) id<AddItemViewControllerDelegate> delegate;
@属性(弱、非原子)id委托;
但是,由于它是弱持有的,所以其他东西必须持有对该委托对象的引用
另外,我在您发布的代码中没有看到分配委托对象的地方。因此,有两件事需要尝试:
代表们被微弱地控制住了。您已使用正确的设置
@property (weak, nonatomic) id<AddItemViewControllerDelegate> delegate;
@属性(弱、非原子)id委托;
但是,由于它是弱持有的,所以其他东西必须持有对该委托对象的引用
另外,我在您发布的代码中没有看到分配委托对象的地方。因此,有两件事需要尝试:
确保您已经分配了代理 除此之外,在让学员执行任何操作之前,您应该检查:
- (IBAction)Cancel:(id)sender {
if ([self.delegate respondsToSelector:@selector(addItemViewControllerDidCancel:)]) {
[self.delegate addItemViewControllerDidCancel:self];
}
}
确保您已经分配了代理 除此之外,在让学员执行任何操作之前,您应该检查:
- (IBAction)Cancel:(id)sender {
if ([self.delegate respondsToSelector:@selector(addItemViewControllerDidCancel:)]) {
[self.delegate addItemViewControllerDidCancel:self];
}
}
是否在ChecklistViewController中分配了代理?如果未设置AddItemViewController的委托为ChecklistViewController实例,则委托方法将不会调用。 像这样:
希望能有所帮助 是否在ChecklistViewController中分配了代理?如果未设置AddItemViewController的委托为ChecklistViewController实例,则委托方法将不会调用。 像这样:
希望能有所帮助 我不确定如何显示
AddItemViewController
它不在您的代码中
viewDidLoad
中的所有内容都是:
AddItemViewController *addItem = [[AddItemViewController alloc]init];
addItem.delegate = self;
但是你没有展示它,所以我认为这是不正常的,因为它是viewload函数的局部函数
另外,您正在使用alloc/init
,这在ViewController
中并不常见,除非您以编程方式为其提供nib
文件,我怀疑您是这样的
最有可能的情况是,您应该在选择或展示该控制器时分配
self
代表。我不确定您如何展示AddItemViewController
它不在您的代码中
viewDidLoad
中的所有内容都是:
AddItemViewController *addItem = [[AddItemViewController alloc]init];
addItem.delegate = self;
但是你没有展示它,所以我认为这是不正常的,因为它是viewload函数的局部函数
另外,您正在使用alloc/init
,这在ViewController
中并不常见,除非您以编程方式为其提供nib
文件,我怀疑您是这样的
最有可能的情况是,您应该在选择或呈现控制器时分配
self
委托。我将代码放在“viewdiload”方法中,但它仍然不起作用。你还有其他想法吗?使用断点来帮助你跟踪代码,看看什么是应该调用的,什么不是应该调用的。我将代码放在“viewdiload”方法中,但它仍然不起作用。你还有其他想法吗?使用断点来帮助你跟踪代码,看看应该调用什么和没有调用什么。我把AddItemViewController*addItem=[[AddItemViewController alloc]init];addItem.delegate=self代码>在viewDidLoad方法中。它仍然不起作用。将addItemViewController设置为属性或实例变量。我将addItemViewController*addItem=[[addItemViewController alloc]init];addItem.delegate=self代码>在viewDidLoad方法中。它仍然不是w