Objective c 代表不工作
我正在尝试关闭一个popover,同时传输数据。我实现了一个委托DismissPopoverDelegate,但它无法工作。但是没有错误。如果点击save(保存)按钮,则会将其注册,并在调用委托后完成该行。但它不起作用 AddEventViewController_iPad.hObjective c 代表不工作,objective-c,ios,protocols,uipopovercontroller,Objective C,Ios,Protocols,Uipopovercontroller,我正在尝试关闭一个popover,同时传输数据。我实现了一个委托DismissPopoverDelegate,但它无法工作。但是没有错误。如果点击save(保存)按钮,则会将其注册,并在调用委托后完成该行。但它不起作用 AddEventViewController_iPad.h #import <UIKit/UIKit.h> #import <AddressBook/AddressBook.h> #import <AddressBookUI/AddressBookU
#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;
#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];
}
}
dateViewPopOverViewController_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;
#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];
}
}
#导入
#进口
@协议解除
@必需的
-(void)dismissWithData:(NSString*)数据;
@结束
@接口dateViewPopOverViewController\u iPad:UIViewController{
IBUIDatePicker*日期选择器;
IBUI分段控制*分段条;
IBUILabel*Abel;
IBUILabel*endLabel;
IBUISwitch*全天开关;
NSDate*起始日期;
NSDate*endDate;
NSDate*现在;
NSDateFormatter*日期格式化程序;
id代表;
}
@属性(保留)id委托;
-(void)dismissWithData:(NSString*)数据;
dateViewPopOverViewController_iPad.m
@实施日期查看PopOverview控制器
@合成startDate、endDate、datePicker、segmentedBar、StartAbel、endLabel、now、allDaySwitch、delegate;
-(iAction)保存:(id)发件人{
如果([self-startDateIsValid]&&[self-endDateIsValid]){
//[[self-parentViewController]setDatesForEvent:startDate eventEndDate:endDate allDay:[allDaySwitch];
//[自我解散Modalviewcontrolleranimated:是];
NSLog(“工程”);
[self.delegate dismissWithData:@“popover中的一些文本”];
NSLog(“工作1”);
}否则{
UIAlertView*alert=[[UIAlertView alloc]initWithTitle:@“oops!”消息:@“请检查日期!记住结束日期必须在事件保存的开始日期之后。”委托:自取消按钮:@“确定”其他按钮:nil];
[警报显示];
[警报发布];
}
}
在包含.h文件时,您有一个循环引用
dateViewPopOverViewController_iPad.h
包括AddEventViewController_iPad.h
和AddEventViewController_iPad.h
包括dateViewPopOverViewController_iPad.h
,这将导致编译器引发错误
使用协议的目的之一是避免这种循环引用。从您的
AddEventViewController\u iPad.h
文件中删除DateViewPopOveranimated
包含可能会解决此问题您对dismissPopoverAnimated
的调用不会触发对代理的调用。来自苹果的UIPopoverDelegate
文档:
popover控制器不调用此方法来响应对
dismissPopoOveranimated
方法的编程调用。如果以编程方式取消POOVER,则应在调用dismissPopoverAnimated
方法后立即执行任何清理操作。仅指出,不应保留委托。您应该将其属性设置为assign,以避免循环引用(这将导致内存泄漏)。检查这篇文章中的答案,确定它消除了一些错误,但仍然有一个错误找不到协议声明…现在是时候在方法中放置一些日志,看看流中哪个没有被调用。不要只说“它不起作用”,因为它不能为人们提供足够的信息来帮助你?日志结果是什么?在创建dateViewPopOverViewController\u iPad对象后,是否设置过该对象的委托属性?哪一行?对不起,但是你必须少用简洁的语言,或者把你的句子改得更好。。。你没有清晰地表达自己上周你问了几乎相同的问题,并在上接受了答案。看一看代码并检查类似的地方vc.delegate=self代码>。只是一个附加组件。尝试始终将委托属性用作具有正确类型的assign,如@property(assign)id delegate
,还要检查委托是否不为null,以及它是否响应要调用的选择器if([self.delegate&&[self.delegate respondsToSelector:@selector(dismissWithData:))){[self.delegate dismissWithData:@“popover中的某些文本”;}