задача 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 2

2 ответа:

Непосредственно перед вызовом [delegate dismissPopover] проверьте, установлен ли delegate на самом деле. Вероятно, это не так.

Я вижу в ParentViewController.m вы создаете экземпляр ConusViewController и устанавливаете его делегат,но никогда не показываете его. В RegionViewController.m вы создаете другой экземпляр ConusViewController без установки его делегата и , который является тем, который, кажется, отображается.

Не уверен, что я пропустил его, но я никогда не видел, чтобы вы устанавливали свойство делегата в ConusViewController. Это должно быть установлено в экземпляр объекта, который должен быть делегирован (объект, который имеет dismissPopover реализован в нем).