2

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

3 个类 ParentViewController 有一个带有按钮的工具栏,该按钮可以调出表格视图 --> RegionViewController 是第一个带有项目的表格视图控制器 --> ConusViewController 是推到导航堆栈上的第二个表格视图控制器。我正在尝试在单击选择后使用委托调用父方法中的方法dismissPopover,以便整个弹出框消失。

在 ConusViewController 中,如果委托有效,我会从父类中的函数中看到“已访问方法”。它没有显示,所以我必须使用错误的委托。

对不起,我的帖子这么罗嗦,我想在这里完成我想要做的事情。谢谢。

父视图控制器.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

父视图控制器.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];
}

区域视图控制器.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];
}
4

2 回答 2

1

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

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

于 2011-02-26T03:04:27.110 回答
0

不确定我是否错过了它,但我从来没有看到你在 ConusViewController 中设置了委托属性。这需要设置为要委托给的对象的一个​​实例(其中实现了 dismissPopover 的对象)。

于 2011-02-26T03:04:06.900 回答