为什么我的自定义代表在Objective-C中没有工作?

时间:2016-01-15 01:49:11

标签: 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调用委托。 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运行时,&#39; self.delegate&#39;是的。任何人都可以告诉我,我的代码有什么问题。谢谢你的意见!

4 个答案:

答案 0 :(得分:3)

代表们被弱势关注。您已使用

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

但是,由于它被弱化,其他东西必须持有对该委托对象的引用。

另外,我在代码中的任何地方都没有看到您分配委托对象的位置。所以,有几件事要尝试:

  1. 确保分配委托(AddItemViewController instance.delegate = ChecklistViewController实例)
  2. 确保其他内容正在引用您的ChecklistViewController,以便在您需要时它不会消失。

答案 1 :(得分:1)

您是否在ChecklistViewController中分配了委托?如果没有设置AddItemViewController的委托是ChecklistViewController实例,则委托方法不会调用。 像这样:

希望有所帮助。

答案 2 :(得分:0)

确保您已经分配了代表。

除此之外,您应该在让代表做任何事情之前进行检查:

src/Nest/QueryDsl/TermLevel/Range/RangeQuery.cs

答案 3 :(得分:0)

我不确定您如何在代码中显示AddItemViewController

viewDidLoad中的所有内容是:

AddItemViewController *addItem = [[AddItemViewController alloc]init];
addItem.delegate = self; 

但是你没有表现出来,所以它让我觉得它不正常,因为它是viewload函数的本地。

此外,您使用的alloc/init ViewController通常不会nib,除非您以编程方式提供self文件,我怀疑您是谁。

最可能你应该在你离开或出现该控制器的那一刻分配var secondCount = someData[a].lenght; // each has different for( b = 1; b < secondCount; b++ ) { allObjects[a][b] = secondObject; } 代表。