【问题标题】:objective C: Using a Delegate to call a function in parent class目标C:使用委托调用父类中的函数
【发布时间】:2011-02-26 02:33:05
【问题描述】:

我正在创建一个 3 层导航弹出控制器,在第三个弹出控制器上我有一个委托方法来访问父类中的 dismissPopup 方法。我似乎无法调用它,我在父类的函数中的 NSLog 消息甚至没有显示,所以我必须要么使用错误的委托,要么我错误地调用它。

ParentViewController 的 3 个类有一个带有按钮的工具栏,可以打开表格视图 --> 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];
}

【问题讨论】:

    标签: objective-c methods delegation


    【解决方案1】:

    在调用[delegate dismissPopover] 之前,检查delegate 是否实际设置。应该不是。

    我在 ParentViewController.m 中看到您创建了 ConusViewController 的实例并设置了它的委托,但从不显示它。在 RegionViewController.m 中,您创建 ConusViewController 的另一个实例而不设置其委托,而 that 似乎正在显示。

    【讨论】:

      【解决方案2】:

      不确定我是否错过了它,但我从未见过你在 ConusViewController 中设置了委托属性。这需要设置为要委托给的对象的实例(其中实现了 dismissPopover 的对象)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-26
        • 2021-02-21
        • 1970-01-01
        • 1970-01-01
        • 2010-09-17
        • 2014-11-09
        相关资源
        最近更新 更多