Отправить сообщение делегата от UIPopover на главный UIViewController - PullRequest
1 голос
/ 16 января 2012

Я пытаюсь использовать кнопку в моем 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];
}

Я использую протокол делегата для связи поповера и ViewController.но я застрял на том, как заставить мой оператор BOOL связать -(void)buttonAPressed в PopoverView и MainViewController, чтобы при нажатии кнопки в Popover текстовое представление появлялось в главном виртуальном канале.Как мне это сделать?

1 Ответ

2 голосов
/ 17 января 2012

В MainViewController, где вы создаете PopoverView, обязательно установите его свойство delegate, в противном случае отправка сообщений на delegate в PopoverView ничего не даст.

Например, в MainViewController.m:

PopoverView *pov = [[PopoverView alloc] initWithNibName:nil bundle:nil];
pov.delegate = self;  // <-- must set this
thePopoverController = [[UIPopoverController alloc] initWithContent...

Я не уверен, зачем вам нужна переменная sendDelegateMessages.Даже с этим bool вы должны установить свойство delegate, чтобы PopoverView имел фактическую ссылку на объект для отправки сообщений.

Если вы хотите убедиться, что объект delegate реализовал метод, который выВы собираетесь позвонить, вы можете сделать это вместо этого:

if ([delegate respondsToSelector:@selector(buttonAPressed)])
    [delegate buttonAPressed];


Кроме того, свойство delegate должно быть объявлено с использованием assign (или weak, если используется ARC) вместо retain (см. Зачем использовать слабый указатель для делегирования? для объяснения):

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


Другое дело, если вы не используете ARC, вам нужно добавить [textfield release]; в конце метода buttonAPressed в MainViewController, чтобы избежать утечки памяти.

...