Ios 为什么我的自定义代理没有';你不能在Objective-C中工作吗?

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

这是我的密码。 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,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委托;
但是,由于它是弱持有的,所以其他东西必须持有对该委托对象的引用

另外,我在您发布的代码中没有看到分配委托对象的地方。因此,有两件事需要尝试:

  • 确保分配了该委托(AddItemViewController实例。委托=ChecklistViewController实例)
  • 确保其他东西正在引用您的ChecklistViewController,以便在需要时它不会消失

  • 代表们被微弱地控制住了。您已使用正确的设置

    @property (weak, nonatomic) id<AddItemViewControllerDelegate> delegate;
    
    @属性(弱、非原子)id委托;
    
    但是,由于它是弱持有的,所以其他东西必须持有对该委托对象的引用

    另外,我在您发布的代码中没有看到分配委托对象的地方。因此,有两件事需要尝试:

  • 确保分配了该委托(AddItemViewController实例。委托=ChecklistViewController实例)
  • 确保其他东西正在引用您的ChecklistViewController,以便在需要时它不会消失

  • 确保您已经分配了代理

    除此之外,在让学员执行任何操作之前,您应该检查:

    - (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