我先说我没写这段代码;它来自于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 的代码时,我一无所获!所以我的问题是:如果作者没有做任何事情,作者为什么要使用这个代码呢?如何更改代码以删除警告,这会影响受影响方法的正确操作?
答案 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