ios - 带有 uidatepicker 委托(delegate)的 uipopover 不起作用

标签 ios uiviewcontroller delegates uipickerview uipopover

我在 Storyboard中创建了一个带有日期选择器的弹出窗口,按下按钮时会弹出该弹出窗口。选择日期并按下完成按钮后,必须将日期发送到 UIViewController

我已经按照 uidatepicker in uipopover delegate 的说明设置了协议(protocol)和委托(delegate)方法但我的 View Controller 中的委托(delegate)方法从未被调用。我错过了什么吗?我需要为此使用segues吗?请帮忙!!

- (IBAction)doneButtonPress:(UIBarButtonItem *)sender {
    NSLog(@"donebuttonpress");
    [_delegate receiveDate:pickedDate];
    NSLog(@"afterdelegation");
}

donebuttonpressafterdelegation 均被打印,但该方法从未被调用:(

//selectDatePopover.h

#import <UIKit/UIKit.h>
@protocol selectDatePopoverDelegate <NSObject>
    - (void)receiveDate:(NSString *)theDate;
@end

@interface selectDatePopover : UIViewController{
    id <selectDatePopoverDelegate> delegate;
}

@property (nonatomic, assign) id < selectDatePopoverDelegate > delegate;
- (IBAction)doneButtonPress:(UIBarButtonItem *)sender;
- (IBAction)mydatepicker:(UIDatePicker *)sender;
@end

//selectDatePopover.m

- (IBAction)doneButtonPress:(UIBarButtonItem *)sender {
    NSLog(@"donebuttonpress");
    NSLog(_delegate);
    [_delegate receiveDate:pickedDate];
    NSLog(@"afterdelegation");
}

- (IBAction)mydatepicker:(UIDatePicker *)sender {
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd"];
    pickedDate = [formatter stringFromDate:[sender date]];
    NSLog(pickedDate);
}

//CheckIn_ViewController.h

#import "selectDatePopover.h"
@interface CheckIn_ViewController : UIViewController <selectDatePopoverDelegate>
    @property UIPopoverController *popover;
@end

//CheckIn_ViewController.m

- (void)receiveDate:(NSString *)theDate {
    NSLog(@"backhere");
    dateLabel.Text = theDate;
}

//按下此按钮时,必须显示弹出窗口:

- (IBAction)calendarbutton:(UIButton *)sender {
    UIView *anchor = sender;
    selectDatePopover *selectDatePopoverInstance =
    [self.storyboard instantiateViewControllerWithIdentifier:@"selectDatePopover"];
    _popover = [[UIPopoverController alloc] initWithContentViewController:selectDatePopoverInstance];
    [_popover presentPopoverFromRect:anchor.frame
                         inView:anchor.superview
       permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

    selectDatePopoverInstance.delegate = self;
}

最佳答案

这一行:self.popover.delegate = self;是不正确的。委托(delegate)协议(protocol)不在 popover 类中,而是在其内容 View Controller 中,即 selectDatePopover。因此,将该行更改为:

selectDatePopover.delegate = self;

关于ios - 带有 uidatepicker 委托(delegate)的 uipopover 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17632628/

相关文章:

ios - 在 Swift (Xcode 6) 的其他 View 中使用来自 View 的输入文本

ios - 禁用/启用 UIDatepicker

ios - 如何在 UILabel 周围绘制边框?

ios - 在初始化第一个 View Controller 之前运行代码(基于 Storyboard的应用程序)

ios - UITableViewController 加载方法的逻辑顺序是什么?

objective-c - 通过委托(delegate)调用时无法识别协议(protocol)方法

Foreach 中的 C# 操作

c# - 无法从 Func<T,T,T> 转换为 Func<T,T,T>

ios - 为什么守卫会破坏类型推断?

ios - 我想创建自定义表格 View 分隔符,UIlabel 位于两个表格 View 单元格之间,就像 iOS 的日历应用程序