задача C: использование делегата для вызова функции в родительском классе
Я создаю 3-слойный всплывающий контроллер навигации, и на 3-м всплывающем контроллере у меня есть метод делегата для доступа к методу dismissPopup, который находится в родительском классе. Я не могу его вызвать, мои сообщения NSLog в функции в родительском классе даже не отображаются, поэтому я должен либо использовать делегирование неправильно, либо я вызываю его неправильно.
3 класса ParentViewController имеет панель инструментов с кнопкой, которая вызывает представление таблицы -- > RegionViewController является первой таблицей контроллер вида с элементами -- > ConusViewController-это 2-й контроллер вида таблицы, который помещается в стек навигации. Я пытаюсь вызвать метод dismissPopover, который находится в Родительском методе с делегированием после того, как выбор нажат, так что весь popover уходит.
В ConusViewController, если бы делегирование работало, я бы увидел "метод доступа" из функции в родительском классе. Это не видно, поэтому я, должно быть, неправильно использую делегирование.
Извините за то, что я был таким многословным на своем посту, я хотел быть полным в том, что я пытаюсь сделать здесь. Спасибо.
ParentViewController.h
#import <UIKit/UIKit.h>
#import "ConusViewController.h"
@interface EnscoWXViewController : UIViewController <ConusViewControllerDelegate> {
UIPopoverController *popoverController;
IBOutlet UIWebView *webImageDisplay;
ConusViewController *cViewController;
}
@property (nonatomic, retain) UIPopoverController *popoverController;
@property (nonatomic, retain) UIWebView *webImageDisplay;
@property (nonatomic, retain) ConusViewController *cViewController;
-(IBAction) buttonShowRegion:(id) sender;
@end
ParentViewController.М
#import "ParentViewController.h"
#import "RegionViewController.h"
@implementation ParentViewController
@synthesize cViewController;
-(IBAction) buttonShowRegion:(id) sender {
...
}
-(void)dismissPopover {
[popoverController dismissPopoverAnimated:YES];
printf("Method Accessedn");
}
- (void)viewDidLoad {
cViewController = [[ConusViewController alloc] init];
cViewController.delegate = self;
[super viewDidLoad];
}
RegionViewController.М
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
switch (indexPath.row) {
case 0: {
ConusViewController *conusViewController = [[ConusViewController alloc] initWithNibName:@"ConusViewController" bundle:nil];
conusViewController.contentSizeForViewInPopover = CGSizeMake(320, 350);
[self.navigationController pushViewController:conusViewController animated:YES];
[conusViewController release];
break;
}
case 1: {
break;
}
}
}
ConusViewController.h
#import <UIKit/UIKit.h>
@protocol ConusViewControllerDelegate <NSObject>
@required
- (void)dismissPopover;
@end
@interface ConusViewController : UITableViewController {
NSMutableArray *conusItems;
id delegate;
}
@property (nonatomic, assign) id <ConusViewControllerDelegate> delegate ;
@end
ConusViewController.М
#import "ConusViewController.h"
#import "ParentWXViewController.h"
@implementation ConusViewController
@synthesize delegate;
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *itemRequested = [conusItems objectAtIndex:indexPath.row];
NSLog(@"logging: %@", itemRequested);
[delegate dismissPopover];
[itemRequested release];
}
2 ответа:
Непосредственно перед вызовом
[delegate dismissPopover]
проверьте, установлен лиdelegate
на самом деле. Вероятно, это не так.Я вижу в ParentViewController.m вы создаете экземпляр ConusViewController и устанавливаете его делегат,но никогда не показываете его. В RegionViewController.m вы создаете другой экземпляр ConusViewController без установки его делегата и , который является тем, который, кажется, отображается.