【问题标题】:iOS- protocols and delegates on the exampleiOS- 示例中的协议和委托
【发布时间】:2011-08-01 19:58:06
【问题描述】:

好的,我正在搜索,但没有任何适合我的方法。以下代码基于许多教程和 Apple 文档,但我无法让它工作。有人可以帮忙吗?

代码在以下位置崩溃:obj.delegee = 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

上午课:

@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.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。

标签: objective-c ios4 delegates protocols


【解决方案1】:

两件事。

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

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

@protocol AViewControllerDelegate&lt;NSObject&gt;

【讨论】:

  • 是的!就是这样,非常感谢您用示例进行如此深入的解释!你刚刚解决了我的头痛^^
  • 但是我在 B 类中的 tappedImage 方法从未被调用过。你能看到并说出原因吗?
  • 确保此时受委托者不为 nil 并且还将协议签名更改为采用 NSNumber 而不是 int,使用 performSelector:withObject: 实际上会向方法传递一个意想不到的*值。 *(NSNumber的指针地址)
  • 好吧,它是 nil (0x0) 但是我认为它已经在我所做的 B 类 (viewDidLoad) 中设置:AViewController *obj = [[[AViewController alloc] init] autorelease]; obj.delegee = 自我;。这个类被加载了,我看到这个命令被调用并且 obj.delegee 被设置为 self(不是 nil)。为什么我仍然有 nil?
  • 是时候设置断点并找出什么是在正确的时间被调用和没有被调用 :) 有趣的东西,如果您缩小问题范围并且仍然需要一些问题,您可能需要发布另一个问题帮助。
【解决方案2】:

我的印象是使用@dynamic delegatee 需要你实现-(id)delegatee(void)setDelegatee:(id)delegatee

【讨论】:

    猜你喜欢
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多