2011-05-15 131 views
0

我试图解雇popover并同时传输数据。我实现了一个委托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]; 
    } 
} 
+1

它是如何失败? – 2011-05-15 14:24:46

+1

是的,它是失败的。 – BDGapps 2011-05-15 14:26:49

+0

只是为了指出,你不应该保留委托。您应该将其属性指定为避免循环引用(这会导致内存泄漏)。检查在这个帖子的答案http://stackoverflow.com/questions/5811590/release-a-viewcontroller-correctly-that-sets-it-self-as-delegate-to-other-classes/5813247#5813247 – 2011-05-15 14:27:13

回答

1

您包括当有一个循环引用。 h文件。

dateViewPopOverViewController_iPad.h包括AddEventViewController_iPad.hAddEventViewController_iPad.h包括dateViewPopOverViewController_iPad.h,这将导致编译器引发错误。

使用协议的目的之一是避免这种循环引用。删除dateViewPopOverViewController_iPad.h包括您的AddEventViewController_iPad.h文件可能会修复问题

+0

好吧现在没有错误,但它不起作用 – BDGapps 2011-05-15 15:02:16

+0

现在是时候把一些日志放在方法中,看看哪一个在流量未被调用。不要试图说'它不工作',因为它没有提供足够的信息,以帮助你的人 – 2011-05-15 15:43:13

+0

好吧我更新了它 – BDGapps 2011-05-15 15:50:29

0

您拨打dismissPopoverAnimated不会触发对代表的呼叫。来自Apple的UIPopoverDelegate文档:

弹出窗口控制器不响应对dismissPopoverAnimated方法的编程调用而调用此方法。如果您以编程方式关闭弹出窗口,则应在调用dismissPopoverAnimated方法后立即执行任何清理操作。