为什么我的委托方法没有被调用?

时间:2011-12-14 14:17:36

标签: iphone objective-c xcode delegates protocols

在这段代码中,我试图使用协议将数组从一个选项卡视图传递到另一个选项卡视图。该方法本身是一个简单的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 个答案:

答案 0 :(得分:4)

首先你应该像这样改变你的协议:

@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];

简而言之,当您在MapViewController中发布GetEntity通知时,它会直接调用-(void)getEntity:的{​​{1}}函数