Цель C: использование делегата для вызова функции в родительском классе - PullRequest
2 голосов
/ 26 февраля 2011

Я создаю трехслойный всплывающий контроллер навигации, и на третьем всплывающем контроллере у меня есть метод делегата для доступа к методу dismissPopup, который находится в родительском классе.Кажется, я не могу это вызвать, мои сообщения NSLog в функции в родительском классе даже не отображаются, поэтому я должен либо использовать делегирование неправильно, либо я вызываю его неправильно.

У 3 классов ParentViewController есть панель инструментов с кнопкой, которая вызывает представление таблицы -> RegionViewController - первый контроллер представления таблицы с элементами -> ConusViewController - второй контроллер представления таблицы, который помещается в навигациюстек.Я пытаюсь вызвать метод dismissPopover, который находится в родительском методе с делегированием после нажатия на выборку, поэтому весь поповер исчезает.

В 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.m

#import "ParentViewController.h"
#import "RegionViewController.h"

@implementation ParentViewController
@synthesize cViewController;

-(IBAction) buttonShowRegion:(id) sender {
...
}

-(void)dismissPopover {
    [popoverController dismissPopoverAnimated:YES];
    printf("Method Accessed\n");
}

- (void)viewDidLoad {
    cViewController = [[ConusViewController alloc] init];
    cViewController.delegate = self;
    [super viewDidLoad];
}

RegionViewController.m

- (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.m

#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 ]

1 голос
/ 26 февраля 2011

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

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

0 голосов
/ 26 февраля 2011

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

...