不兼容的指针类型发送' NSDate *'参数类型' NSCalendar *'?

时间:2015-02-13 17:43:31

标签: objective-c delegates nsdate nscalendar ios8.1

我先说我没写这段代码;它来自于2010年由 tinyFool 编写的Calendar API。因此,它在Apple弃用CFGregorianDate之前完成了它应该做的事情。现在,我正在尝试将其转换为推荐的NSCalendar。如果你需要更多我没有提供的相关代码,请告诉我,我会发布它。

我有两个陈述出现在几个地方:

    [calendarViewDelegate monthChanged: currentMonthDate viewLeftTop:self.frame.origin height:height];
    [calendarViewDelegate beforeMonthChange:self willto: currentMonthDate];

它给了我以下警告:

  

不兼容的指针类型将“NSDate *”发送到“NSCalendar *”类型的参数

这是委托定义:

@protocol CalendarViewDelegate <NSObject>
@optional
- (void) selectDateChanged:(NSCalendar *) selectDate;
- (void) monthChanged:(NSCalendar *) currentMonth viewLeftTop:(CGPoint)viewLeftTop height:(float)height;
- (void) beforeMonthChange:(CalendarView *) calendarView willto:(NSCalendar *) currentMonth;
@end

代表是我的弱点之一;出于某种原因,我似乎无法理解它们,尽管我明白它们的目的是什么。当我查看 monthChanged 的代码时,我一无所获!所以我的问题是:如果作者没有做任何事情,作者为什么要使用这个代码呢?如何更改代码以删除警告,这会影响受影响方法的正确操作?

1 个答案:

答案 0 :(得分:1)

- (void) monthChanged:(NSCalendar *) currentMonth viewLeftTop:(CGPoint)viewLeftTop height:(float)height;期望NSCalendar作为第一个arg并且您传递的是NSDate。要么传递日历,要么传递日历,要么更新委托方法以获取日期arg而不是NSCalendar参数。你写过这些委托方法了吗?

如果Self是NSCalendar,那么可能应该被称为

[calendarViewDelegate monthChanged:self viewLeftTop:self.frame.origin height:height];

否则,如果您打算通过NSDate

@protocol CalendarViewDelegate <NSObject>
@optional
- (void) selectDateChanged:(NSDate *) selectDate;
- (void) monthChanged:(NSDate *) currentMonth viewLeftTop:(CGPoint)viewLeftTop height:(float)height;
- (void) beforeMonthChange:(CalendarView *) calendarView willto:(NSDate *) currentMonth;
@end

<强>更新

委托中委托方法的示例实现,如果说MYView需要在每次日期更改时显示警报

@interface MYView ()<CalendarViewDelegate>
@end
@implementation MYView
- (void)viewDidLoad{
    self.calendarView = [[CalendarView alloc] init];
    self.calendarView.delegate = self;
}
- (void) monthChanged:(NSDate *) currentMonth viewLeftTop:(CGPoint)viewLeftTop height:(float)height{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"date changed" andBlahBlah];
    [alert show];
}
@end