0

我做了一个自定义委托:

示例.h:

@protocol DismissExamplePopoverDelegate
- (void) dismissExamplePopover;
- (int) getUserID;
@end


@interface Example : UIViewController{
    id<DismissExamplePopoverDelegate> delegate;
}

@property (nonatomic, assign) id<DismissExamplePopoverDelegate> delegate;

它在 Example.m 中被调用,如下所示:

[[self delegate] getUserID];

在我的 maincontroller.h 中:

#import "Example.h"

@interface MainScreen : UIViewController<DismissExamplePopoverDelegate>

主控制器.m:

-(int) getUserID
{
    return 100;
}

视图示例通过以下方法调用:

ExampleController = [[Example alloc] initWithNibName:@"Example" bundle:nil];
ExamplePopoverController = [[UIPopoverController alloc] initWithContentViewController:ExampleController];

[ExampleController setDelegate:self];
ExamplePopoverController.popoverContentSize = CGSizeMake(600, 480);

if ([ExamplePopoverController isPopoverVisible]) {
        [ExamplePopoverController dismissPopoverAnimated:YES];
} else {
    CGRect popRect = CGRectMake((self.EditExampleSelectAddButtonProperty.frame.origin.x),
                                    (self.EditExampleSelectAddButtonProperty.frame.origin.y),
                                    (self.ExampleSelectAddButtonProperty.frame.size.width),
                                    (self.ExampleSelectAddButtonProperty.frame.size.height));
    [ExamplePopoverController presentPopoverFromRect:popRect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}

如果我放置[[self delegate] getUserID]在任何其他函数中,viewdidload它都可以正常工作:返回 100;其中viewdidload返回 0。

我想要实现的是在弹出框加载时自动调用的委托。viewdidload 是最适合它的地方,还是在其他地方

4

3 回答 3

0

确保您实际上将委托属性分配给 MainController。例如,无论您在哪里初始化了 Example,都需要设置委托属性:

Example *example = [[Example alloc] init];
example.delegate = self; // Use this if you're initializing Example in MainController

如果您没有在 MainController 中初始化 Example,请使用 MainController 实例而不是“self”。

于 2013-06-07T02:19:44.713 回答
0

有几个人说过这个,但对解决方案还不够清楚。

而不是这样做:

ExampleController = [[Example alloc] initWithNibName:@"Example" bundle:nil];
ExamplePopoverController = [[UIPopoverController alloc] initWithContentViewController:ExampleController];

[ExampleController setDelegate:self];

做这个:

ExampleController = [[Example alloc] initWithNibName:@"Example" bundle:nil];
[ExampleController setDelegate:self];

ExamplePopoverController = [[UIPopoverController alloc] initWithContentViewController:ExampleController];

发生的事情是-[UIPopoverController initWithContentViewController:]使用它contentViewController的 's view,导致-[Example viewDidLoad]被调用。由于此时您尚未设置委托,因此委托是nil, 并尝试在nil返回nil0或上调用任何方法0.0

于 2013-06-07T12:11:58.193 回答
-1

在 Example.m 中,您需要添加一行:

[self setDelegate:delegate];

此外,您还需要@synthesize delegate;

希望有帮助)

于 2013-06-07T11:08:22.607 回答