Делегат не работает - PullRequest
0 голосов
/ 15 мая 2011

Я пытаюсь закрыть поповер и передавать данные одновременно.Я реализовал делегат DismissPopoverDelegate, но он не работает.Но ошибок нет.Если нажать кнопку «Сохранить», он регистрирует ее и завершает строку после того, как вызывает делегата.Но это не работает ...

AddEventViewController_iPad.h

#import <UIKit/UIKit.h>
#import <AddressBook/AddressBook.h>
#import <AddressBookUI/AddressBookUI.h>
#import <EventKit/EventKit.h>
#import <EventKitUI/EventKitUI.h>
#import <MessageUI/MessageUI.h>
#import <MessageUI/MFMailComposeViewController.h>
#import <Foundation/Foundation.h>
#import "AboutSme.h"
#import "dateViewPopOverViewController_iPad.h"
#import "addPersonViewControllerPopover_iPad.h"
#import "PreviousEventsTableViewControllerPopover_iPad.h"

@interface AddEventViewController_iPad : UIViewController <UITableViewDelegate, UITableViewDataSource, MFMailComposeViewControllerDelegate, UITextFieldDelegate, UIAlertViewDelegate,UIPopoverControllerDelegate,UINavigationControllerDelegate,UIPopoverControllerDelegate,ABPeoplePickerNavigationControllerDelegate, ABNewPersonViewControllerDelegate, DismissPopoverDelegate> {
UIPopoverController *pop;

AddEventViewController_iPad.m

 - (IBAction) selectStartDate:(id) sender {
  NSLog(@"Select start date");
       dateViewPopOverViewController_iPad *dateViewPopOverViewController =     [[dateViewPopOverViewController_iPad alloc] init];
popover2 = [[UIPopoverController alloc]   initWithContentViewController:dateViewPopOverViewController];

 popover2.delegate = self;
  popover2.popoverContentSize = CGSizeMake(320, 460);

CGRect rect = CGRectMake(790, 170, 175, 300);

[popover2 presentPopoverFromRect:rect inView:self.view      permittedArrowDirections:UIPopoverArrowDirectionRight animated:YES];

[dateViewPopOverViewController release];

/*
if (dateViewController == nil) {
    dateViewController = [[DateViewController_iPad alloc] initWithNibName:@"DateViewController_iPad" bundle:nil];
}

[self presentModalViewController:dateViewController animated:YES];

[dateViewController retain];
 */
}

- (void) dismissWithData:(NSString *)data
{
NSLog(@"%@", data);

[pop dismissPopoverAnimated:YES];
[pop release];
}

dateViewPopOverViewController_iPad.h

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
@protocol DismissPopoverDelegate <NSObject>
@required
- (void) dismissWithData:(NSString *)data;

@end
@interface dateViewPopOverViewController_iPad : UIViewController {
IBOutlet UIDatePicker *datePicker;
IBOutlet UISegmentedControl *segmentedBar;
IBOutlet UILabel *startLabel;
IBOutlet UILabel *endLabel;
IBOutlet UISwitch *allDaySwitch;
NSDate *startDate;
NSDate *endDate;    
NSDate *now;
NSDateFormatter *dateFormatter;
id<DismissPopoverDelegate> delegate;
}

@property (retain) id delegate;
- (void) dismissWithData:(NSString *)data;



dateViewPopOverViewController_iPad.m

    @implementation dateViewPopOverViewController_iPad

    @synthesize startDate, endDate, datePicker, segmentedBar, startLabel, endLabel, now, allDaySwitch, delegate;

  - (IBAction) save:(id)sender {
    if ([self startDateIsValid] && [self endDateIsValid]) {
        //[[self parentViewController] setDatesForEvent:startDate eventEndDate:endDate allDay:[allDaySwitch isOn]];
  //  [self dismissModalViewControllerAnimated:YES];
        NSLog(@"works");
       [self.delegate dismissWithData:@"Some text from popover"];
  NSLog(@"works1");
    } else {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Ooops!" message:@"Please check the dates! Remember the end date must occur after the start date for the event to save." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alert show];
        [alert release];
    }
}

Ответы [ 2 ]

1 голос
/ 15 мая 2011

При включении файлов .h у вас есть циклическая ссылка.

dateViewPopOverViewController_iPad.h включает AddEventViewController_iPad.h и AddEventViewController_iPad.h включает dateViewPopOverViewController_iPad.h, что приведет к ошибке компилятора.

Одна из целей использования протоколов - избежать такого рода циклических ссылок.Удаление dateViewPopOverViewController_iPad.h include из вашего AddEventViewController_iPad.h файла может решить проблему

0 голосов
/ 06 января 2012

Ваш звонок на dismissPopoverAnimated не вызовет звонок делегату.Из документации UIPopoverDelegate Apple:

Контроллер всплывающего окна не вызывает этот метод в ответ на программные вызовы метода dismissPopoverAnimated.Если вы программно закрыли поповер, вы должны выполнить любые действия по очистке сразу после вызова метода dismissPopoverAnimated.

...