3

我正在使用 XCode 4.5.1 构建一个 iOS 6 应用程序

我正在尝试使用我的控制器可以用来检索图像的协议。但是,尽管我这样称呼它,但我的代表从未被调用过:

UIImage *image = [self.delegate mapViewController:self imageForAnnotation:aView.annotation];

当我调试这条线时,我可以看到self.delegate它为空,尽管我将 TableViewController 关联为其委托。

MapViewController.h:

@class MapViewController;
@protocol MapViewControllerDelegate <NSObject>
    - (UIImage *)mapViewController:(MapViewController *)sender imageForAnnotation:(id <MKAnnotation>)annotation;
@end

@interface MapViewController : UIViewController
@property (nonatomic, weak) id <MapViewControllerDelegate> delegate;
@end

MapViewController.m:

@implementation MapViewController
@synthesize delegate = _delegate;

我使用 TableViewController 作为MapViewControllerDelegate

@interface RecentPhotosTableViewController () <MapViewControllerDelegate>

- (PhotoViewController *) splitViewPhotoViewController;
@end

@implementation RecentPhotosTableViewController
- (UIImage *)mapViewController:(MapViewController *)sender imageForAnnotation:(id <MKAnnotation>)annotation
{
    FlickrPhotoAnnotation *fpa = (FlickrPhotoAnnotation *)annotation;
    NSURL *url = [FlickrFetcher urlForPhoto:fpa.photo format:FlickrPhotoFormatSquare];
    NSData *data = [NSData dataWithContentsOfURL:url];
    return data ? [UIImage imageWithData:data] : nil;
}

@end
4

2 回答 2

5

您的代码都没有显示您将任何内容设置为其他任何内容的代表。您声明了一些属性并采用了一些协议,但实际上没有一个将delegate属性设置self为值。

于 2013-03-09T22:53:04.850 回答
0

当然,我们没有您的所有源代码,但 Etan 和 CodaFi 似乎是正确的:您实例化RecentPhotosTableViewController对象并将该对象设置为 MapViewController 对象的委托的代码行在哪里?

我想我们期待看到类似的东西:

@implementation RecentPhotosTableViewController

- (void) someMethod {
    self.mapViewController = [[MapViewController alloc] init];
    self.mapViewController.delegate = self;
    ...
}

您已经在 MapViewController 类中声明了一个委托属性,但您必须在实例化后将该委托属性实际设置为某个对象以使委托调用起作用。

(对不起,如果这太简单了,但看起来你在概念上遇到了一个非常基本的困难;如果我错过了重点,请道歉!)

于 2013-03-09T23:02:31.213 回答