Почему мой метод делегата не вызывается? - PullRequest
3 голосов
/ 14 декабря 2011

В этом коде я пытаюсь передать массив из одной вкладки в другую, используя протоколы. Сам метод является простым методом get с одной строкой, возвращающей mutableArray. Внутри своего класса это работает, внутри этого класса его даже не вызывают.

- (void)viewDidLoad
{
    [super viewDidLoad];
    myLocationEntityArray = [[NSMutableArray alloc] initWithArray:[[self delegate] getMyLocationEntityArray]];
}

Заголовочный файл для класса, получающего данные:

#import <UIKit/UIKit.h>
#import <MapKit/MapKit.h>
#import <CoreLocation/CoreLocation.h>
@protocol CoreDataDelegate;

@interface ListTableViewController : UITableViewController
{
    NSManagedObjectContext *managedObjectContext;
    NSMutableArray *myLocationEntityArray;

    id <CoreDataDelegate> delegate;
}

- (NSMutableArray *)fetchCoreData;

@property(nonatomic, retain) NSManagedObjectContext *managedObjectContext;
@property(nonatomic, assign) id <CoreDataDelegate> delegate;
@property(nonatomic, retain) NSMutableArray *myLocationEntityArray;

@end

@protocol CoreDataDelegate

//- (NSMutableArray *) fetchCoreData;
- (NSMutableArray *) getMyLocationEntityArray;

@end

В верхней части заголовочного файла отправляются данные:

@interface MapViewController : UIViewController <CLLocationManagerDelegate, CoreDataDelegate>

1 Ответ

4 голосов
/ 14 декабря 2011

Сначала вы должны изменить свой прокотол следующим образом:

@protocol CoreDataDelegate

//- (NSMutableArray *) fetchCoreData;
- (void) getMyLocationEntityArray:(NSMutableArray *)entityArray;

@end

Вы устанавливаете MapViewController, чтобы он отвечал на ваш протокол CoreDateDelegate.Итак, я полагаю, вы разместили свой ListTableViewController внутри MapViewController.Если это так, вам нужно сделать следующее:

// MapViewController.m
...
ListTableViewController *listVC = [[ListTableViewController alloc] init];
listVC.delegate = self;
// display your listVC
...

// Somewhere in your code of MapViewController.m
- (void) getMyLocationEntityArray:(NSMutableArray *)entityArray {
   // do something with entityArray
}

РЕДАКТИРОВАТЬ

Следуя вашим комментариям, вот более простой способ сделать то, что вы хотите.NSNotification.Он не требует протокола и его легче реализовать.

// In ListTableViewController.m
// In Init or viewDidLoad function


   [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(getEntity:) 
                                                 name:@"GetEntity"
                                               object:nil];

- (void)getEntity:(NSNotification *)notif {
   NSArray *entityArray = (NSArray *)[notif object];
   // do something with entityArray
}

// In dealloc or viewDidUnLoad function
   [[NSNotificationCenter defaultCenter] removeObserver:self 
                                                 name:@"GetEntity"
                                               object:nil];


// In MapViewController.m
// theEntityArray to be defined
    [[NSNotificationCenter defaultCenter] postNotificationName:@"GetEntity"
                                                         object:theEntityArray 
                                                       userInfo:nil];

В двух словах, когда вы отправите уведомление GetEntity в MapViewController, он будет вызывать функцию -(void)getEntity: из ListTableViewController.

...