Ошибка делегата

Я хочу сделать следующее:

Во-первых, TopPlacesViewController имеет переход к классу SinglePlacePhotosViewController (контроллеру TableView).

Я создаю делегата в классе 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;    
}

person dsfdf    schedule 30.06.2012    source источник
comment
Определение segue.destinationViewController не имеет -setDelegate.   -  person Vervious    schedule 30.06.2012
comment
на самом деле я только что посмотрел его.   -  person dsfdf    schedule 30.06.2012
comment
Это странно. Определено ли это SinglePlacePhotosViewController?   -  person Vervious    schedule 30.06.2012
comment
Ага, можешь показать больше кода @interface для SinglePlacePhotosViewController? Похоже, что для вашего делегата отсутствует @property.   -  person Chris Trahey    schedule 30.06.2012
comment
я уже установил @property для делегата   -  person dsfdf    schedule 03.07.2012


Ответы (1)


Да, именно ошибка очевидна, потому что вы вызываете метод установки (setDelegate:) SinglePlacePhotosviewController, но делегат идентификатора @property (неатомный, слабый); находится в TopPlacesViewController.

вы используете протокол здесь неправильно. если вы хотите передать массив фотографий из TopPlacesViewController в SinglePlacePhotosviewController, просто назначьте массив из TopPlacesViewController массиву SinglePlacePhotosviewController в методе prepareSegue.

Протоколы, обычно используемые для передачи ссылки одного класса на другой класс, здесь у вас уже есть экземпляр SinglePlacePhotosviewController (segue.destinationController) в TopPlacesViewController. Если вам нужна ссылка TopPlacesViewController в SinglePlacePhotosviewController, вам нужно создать протокол в SinglePlacePhotosviewController и передать сам TopPlacesViewController протоколу делегата SinglePlacePhotosviewController в методе подготовки перехода, как вы делаете здесь. надеюсь, я очистил ваш запрос, пожалуйста, дайте мне знать.

person Deepak    schedule 30.06.2012
comment
извините за мой поздний повтор. Да, я понял, что ты сказал. Я знаю, что могу просто использовать segue.destinationController, чтобы получить ссылку на singleplacePhotoViewController, но я просто хочу попробовать делегат, чтобы получить эту ссылку. Итак, я меняю prepareforsegue следующим образом: [segue.destinationViewController setDelegate:segue.destinationViewController]; Однако это все равно не сработало. Не могли бы вы сказать, почему? Большое Вам спасибо. - person dsfdf; 03.07.2012
comment
привет, Пан, во-первых, вы используете метод setDelegate, который не принадлежит вашему целевому контроллеру, поэтому вы получаете ошибку [SinglePlacePhotosViewController setDelegate:]: unrecognized selector.yes, вы можете сделать это с помощью метода делегата, для которого вы должны объявить этот протокол TopPlacesViewControllerDelegate в SinglePlacePhotosViewController, а объявите его в TopPlacesViewController. Попробуйте, это поможет вам. На самом деле setDelegate означает, что вы вызываете метод установки некоторого свойства с именем делегата, которое объявлено в SinglePlacePhotosViewController. - person Deepak; 03.07.2012
comment
ах, наконец я вижу свою проблему. Большое спасибо. - person dsfdf; 11.07.2012
comment
Я только что обнаружил, что совершил глупую ошибку. лол И да, это помогает. Спасибо - person dsfdf; 13.07.2012