委托错误

时间:2012-06-30 04:42:15

标签: objective-c delegates cs193p

我想做的事情是:

首先,TopPlacesViewController对类SinglePlacePhotosViewControllerTableView控制器)有一个segue。

我在TopPlacesViewController类中创建了一个委托,然后使用prepareforSegue方法将SinglePlacePhotosViewController设置为委托并实现协议方法。

然后当我点击TopPlacesViewController(TableView控制器)中的照片时,它会调用方法TopPlacesViewController,该方法应显示该地点的一些照片。

但我一直收到这个错误:

  

[SinglePlacePhotosViewController setDelegate:]:无法识别的选择器发送到实例0xc94cc20

我的TopPlacesViewController.h文件:

@class TopPlacesViewController;  

@protocol TopPlacesViewControllerDelegate    
- (void)topPlacesViewControllerDelegate:(TopPlacesViewController *)sender
                            showPhotos:(NSArray *)photo;   
@end

@interface TopPlacesViewController : UITableViewController

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

TopPlacesViewController.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{                                                                                  
    NSDictionary *place = [self.places objectAtIndex:indexPath.row];   
    self.singlePlacePhotos = [FlickrFetcher photosInPlace:place maxResults:50];   
    [self.delegate topPlacesViewControllerDelegate:self showPhotos:self.singlePlacePhotos];  
    [self performSegueWithIdentifier:@"Flickr Photos" sender:self];   
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{   
    if([segue.identifier isEqualToString:@"Flickr Photos"]) {                                  
          [segue.destinationViewController setDelegate:self];     
    }         
}  

然后在此我实现了委托:

@interface SinglePlacePhotosViewController () <"TopPlacesViewControllerDelegate">    
- (void)topPlacesViewControllerDelegate:(TopPlacesViewController *)sender showPhoto:(NSArray *)photo    
{    
    self.photos = photo;    
}

1 个答案:

答案 0 :(得分:2)

是的,错误是显而易见的,因为您正在调用SinglePlacePhotosviewController的setter方法(setDelegate :),但是@property(非原子,弱)id委托;在TopPlacesViewController中。

你在这里以错误的方式使用协议。 如果你想将TopPlacesViewController中的照片数组传递给SinglePlacePhotosviewController,  只需将TopPlacesViewController中的数组分配给prepareSegue方法中的SinglePlacePhotosviewController数组。

协议通常用于将一个类的引用传递给另一个类,这里​​你已经在TopPlacesViewController中有SinglePlacePhotosviewController(segue.destinationController)的实例。如果你想在SinglePlacePhotosviewController中引用TopPlacesViewController,那么你必须在SinglePlacePhotosviewController中制作协议,并在准备segue方法时将TopPlacesViewController的self传递给SinglePlacePhotosviewController的委托协议,就像你在这里做的那样。 希望我已经清除了你的疑问,请告诉我。