委托方法没被调用?

时间:2013-11-21 23:50:17

标签: ios objective-c cocoa-touch uiviewcontroller delegates

我有一个带有委托方法的视图控制器应该被调用,但它没有?

NotifyingViewController.h

@protocol NotifyingViewControllerDelegate <NSObject>
@required
- (void)iWasAccepted;
@end

@interface NotifyingViewController : UIViewController

@property (nonatomic, weak) id<NotifyingViewControllerDelegate> delegate;

NotifyingViewController.m

-(void)someMethod{
        [self.delegate iWasAccepted];
        [self dismissViewControllerAnimated:YES completion:nil];
}

NotifiedViewController.h

#import "NotifyingViewController.h"  
@interface NotifiedViewController : UIViewController <NotifyingViewControllerDelegate>

NotifiedViewController.m

-(void)iWasAccepted{
    [self saveIntoDB];
    NSLog(@"DELEGATE RAN");
}

由于某种原因,应该通知的控制器不是。通知控制器确实忽略了警告委托IS运行的方法,但委托不运行该函数,因为它不是NSLog。有什么想法吗?

1 个答案:

答案 0 :(得分:24)

您不能只指定对象符合协议。您还必须将该对象指定为委托。当你分配/初始化NotifyingViewController的实例时,将它的委托设置为self,你应该没问题。

NotifyingViewController *notifyingInstance = [[NotifyingViewController alloc] init];
[notifyingInstance setDelegate:self];

这两个都很重要,并指定该类符合您已使用此行执行的协议。

@interface NotifiedViewController : UIViewController <NotifyingViewControllerDelegate>

此外,在调用委托方法时,最好将函数调用包装在respondsToSelector:个检查中。

if ([self.delegate respondsToSelector:@selector(iWasAccepted)]) {
    [self.delegate iWasAccepted];
}