iOS - 举例解释协议和委托

3

好的,我正在搜索,但是没有任何方法适用于我。以下代码基于许多教程和苹果文档,但我无法使其正常工作。有人可以帮忙吗?

代码在 obj.delegatee = self; (在 B.h 类中) 处崩溃,同时方法 respondsToSelector 和 performSelector:withObject 也无法识别。

我想要设置代理对象,在点击特定图片时调用一个方法。

A.h 类:

@interface AViewController : UIViewController <UIScrollViewDelegate>{
    id delegatee;
}
@property (nonatomic, assign) id <AViewControllerDelegate> delegatee;
@end

@protocol AViewControllerDelegate
@optional
- (void) tappedImage:(int)tag;
@end

类A中的方法m:

@dynamic delegatee;
- (void)handleSingleTap:(UIGestureRecognizer *)gestureRecognizer {
UIImageView *imageView = (UIImageView *)[gestureRecognizer view];
int a = imageView.tag;

if ([self.delegatee respondsToSelector:@selector(tappedImage:)])
    [self.delegatee performSelector:@selector(tappedImage:) withObject: [NSNumber numberWithInt:a]];

}

B 类的头文件 B.h:

#import "AViewController.h"
@interface BViewController : UIViewController <AViewControllerDelegate> {...}

类B.m:

- (void)viewDidLoad
{
[super viewDidLoad];
//... some code

AViewController *obj = [[[AViewController alloc] init] autorelease];
obj.delegatee = self;
}

- (void) tappedImage:(int)tag{
UIImageView *imgView = [[UIImageView alloc] initWithImage:[UIImage imageNamed: [NSString stringWithFormat: @"%d.png",tag]]];
CViewController *NView = [[CViewController alloc] initWithPicture: imgView.image];
[self presentModalViewController:NView animated:YES];
[NView release]; NView = nil;
}

非常感谢你的帮助,我希望这能帮助我理解协议是如何工作的。

你确定要使用 @dynamic 吗?我猜你应该使用 @synthesize。 - Colin
2个回答

4

两件事情。

  1. (您的崩溃) 您将您的delegatee声明为 @dynamic 而不是 @synthesize,这意味着您需要创建 -(void)setDelegatee:(id<AViewControllerDelegate>)(和getter)方法。修复:只需将其从@dynamic更改为@synthesize delegatee;

  2. (您的警告) 每当您想调用在协议中没有明确定义的方法时,那么您的协议将需要符合另一个协议 :). 修复:将NSObject协议添加到您的声明中。

@protocol AViewControllerDelegate<NSObject>


是的!这就是问题所在,非常感谢您提供如此深入的解释和示例!您刚刚解决了我的难题^^ - Nat
然而,我的B类中的tappedImage方法从未被调用... 你能看出来并告诉我为什么吗? - Nat
请确保在此时委托对象不为nil,并将协议签名更改为使用NSNumber而不是int。如果使用performSelector:withObject:方法,则实际上会向该方法传递一个意外的值(即NSNumber的指针地址)。 - Joe
是时候设置断点,找出什么在正确的时间被调用和未被调用了 :) 这很有趣,如果你缩小了问题范围但仍需要帮助,可能需要发布另一个问题。 - Joe
是的,我正在此刻进行 ^^ 非常感谢您的所有帮助! - Nat
显示剩余2条评论

0
我曾认为使用 @dynamic delegatee 需要你实现 -(id)delegatee(void)setDelegatee:(id)delegatee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接