从UIPopover向Main UIViewController发送一个Delegate消息

时间:2012-01-16 18:25:03

标签: ios uiviewcontroller delegates uitextview uipopovercontroller

我正在尝试使用UIPopover中的按钮在我的主UITextView中创建UIViewController我看起来像这样的代码(PopoverView.h文件) :

@protocol PopoverDelegate <NSObject> 

- (void)buttonAPressed;

@end

@interface PopoverView : UIViewController <UITextViewDelegate> {  //<UITextViewDelegate>

    id <PopoverDelegate> delegate;
    BOOL sendDelegateMessages;
}
@property (nonatomic, retain) id delegate;
@property (nonatomic) BOOL sendDelegateMessages;
@end

然后在我的PopoverView.m文件中:

- (void)viewDidLoad
{
    [super viewDidLoad];

UIButton * addTB1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
addTB1.frame = CGRectMake(0, 0, 100, 50);
[addTB1 setTitle:@"Textbox One" forState:UIControlStateNormal];
[self.view addSubview:addTB1];    // Do any additional setup after loading the view from its nib.
[addTB1 addTarget:self action:@selector(buttonAPressed) 
forControlEvents:UIControlEventTouchUpInside];
}

- (void)buttonAPressed
{
    NSLog(@"tapped button one");

    if (sendDelegateMessages)
        [delegate buttonAPressed];
}

还在我的MainViewController.m

- (void)buttonAPressed {

    NSLog(@"Button Pressed");
    UITextView *textfield = [[UITextView alloc] init];
    textfield.frame = CGRectMake(50, 30, 100, 100);
    textfield.backgroundColor = [UIColor blueColor];
    [self.view addSubview:textfield];
}

我正在使用委托协议来链接popover和ViewController但我仍然坚持如何获取BOOL语句来链接PopoverView和MainViewController中的-(void)buttonAPressed以便当我按下Popover中的按钮,主VC中会出现textview。我该怎么做呢?

1 个答案:

答案 0 :(得分:2)

在您创建MainViewController的{​​{1}}中,请确保设置其PopoverView属性,否则向delegate中的delegate发送消息将不会执行任何操作。< / p>

例如,在PopoverView

MainViewController.m

我不确定你为什么需要PopoverView *pov = [[PopoverView alloc] initWithNibName:nil bundle:nil]; pov.delegate = self; // <-- must set this thePopoverController = [[UIPopoverController alloc] initWithContent... 变量。即使使用该bool,您也必须设置sendDelegateMessages属性,以便delegate具有实际的对象引用以将消息发送到。

如果你想确保PopoverView对象已经实现了你要调用的方法,你可以这样做:

delegate


此外,if ([delegate respondsToSelector:@selector(buttonAPressed)]) [delegate buttonAPressed]; 属性应使用delegate(或assign,如果使用ARC)而不是weak声明(请参阅Why use weak pointer for delegation?获取解释):

retain


另一件事是,如果您不使用ARC,则需要在@property (nonatomic, assign) id<PopoverDelegate> delegate; [textfield release];方法的末尾添加buttonAPressed以避免内存泄漏。