Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 代表不工作_Objective C_Ios_Protocols_Uipopovercontroller - Fatal编程技术网

Objective c 代表不工作

Objective 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

我正在尝试关闭一个popover,同时传输数据。我实现了一个委托DismissPopoverDelegate,但它无法工作。但是没有错误。如果点击save(保存)按钮,则会将其注册,并在调用委托后完成该行。但它不起作用

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;
#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中的某些文本”;}