寫作原因:到第二家公司的時(shí)候首次看到我們的日程有這個(gè)功能怔鳖,之前都沒有用到過:
類簡(jiǎn)單預(yù)覽
- (instancetype)initRecurrenceWithFrequency:(EKRecurrenceFrequency)type
interval:(NSInteger)interval
daysOfTheWeek:(nullable NSArray<EKRecurrenceDayOfWeek *> *)days
daysOfTheMonth:(nullable NSArray<NSNumber *> *)monthDays
monthsOfTheYear:(nullable NSArray<NSNumber *> *)months
weeksOfTheYear:(nullable NSArray<NSNumber *> *)weeksOfTheYear
daysOfTheYear:(nullable NSArray<NSNumber *> *)daysOfTheYear
setPositions:(nullable NSArray<NSNumber *> *)setPositions
end:(nullable EKRecurrenceEnd *)end
絕大多數(shù)時(shí)候都是使用這個(gè)初始化函數(shù),我們會(huì)按照type的不同來選擇性的填寫初始化參數(shù)副编;我們先來看看各參數(shù)是什么意思
type
typedef NS_ENUM(NSInteger, EKRecurrenceFrequency) {
EKRecurrenceFrequencyDaily,//按天
EKRecurrenceFrequencyWeekly,//按周
EKRecurrenceFrequencyMonthly,//按月
EKRecurrenceFrequencyYearly//按年
};
重復(fù)規(guī)則
interval
間隔單位负甸,會(huì)根據(jù)type的不同用法也不一樣
days
EKRecurrenceDayOfWeek類型,表示星期一痹届、星期二...星期日呻待,可以傳入多個(gè)值
monthDays
一個(gè)月中的幾號(hào),可以傳入多個(gè)值
months
一年中的幾月队腐,可以傳入多個(gè)值
weeksOfTheYear
一年中的多少周蚕捉,可以傳入多個(gè)值
daysOfTheYear
一年中的多少號(hào),可以傳入多個(gè)值
setPositions
規(guī)則之外的數(shù)字柴淘,也就是除了上面的規(guī)則我還需要這些點(diǎn)也觸發(fā)執(zhí)行
end
EKRecurrenceEnd類型迫淹,標(biāo)示規(guī)則結(jié)束;有次數(shù)(如只執(zhí)行10次)和時(shí)間(如該時(shí)間后不再計(jì)算)兩個(gè)選擇
下面我就講講我的規(guī)則選擇界面(文章開頭的gif圖)都填充了哪些參數(shù)來初始化为严;我們假設(shè)需要執(zhí)行規(guī)則的時(shí)間為:2016-12-01到2016-12-31中的早上8:30到晚上6:30敛熬;下面我們以type的四種情況開始講
EKRecurrenceFrequencyDaily
當(dāng)type為EKRecurrenceFrequencyDaily時(shí),填充interval和days
一:interval為6第股,days為nil应民;也就是每6天執(zhí)行一次
我們用一個(gè)庫來計(jì)算出所有的事件開始時(shí)間得到如下結(jié)果:
<__NSArrayM 0x600000455a80>(
2016-12-06 08:30:00 +0000,
2016-12-12 08:30:00 +0000,
2016-12-18 08:30:00 +0000,
2016-12-24 08:30:00 +0000,
2016-12-30 08:30:00 +0000
)
這個(gè)結(jié)果剛好就是每隔6天執(zhí)行一次
二:interval為1,days為星期一...星期五夕吻;也就是每個(gè)工作日?qǐng)?zhí)行一次
<__NSArrayM 0x61000025e390>(
2016-12-01 08:30:00 +0000,
2016-12-02 08:30:00 +0000,
2016-12-05 08:30:00 +0000,
2016-12-06 08:30:00 +0000,
2016-12-07 08:30:00 +0000,
...
2016-12-26 08:30:00 +0000,
2016-12-27 08:30:00 +0000,
2016-12-28 08:30:00 +0000,
2016-12-29 08:30:00 +0000,
2016-12-30 08:30:00 +0000
)
EKRecurrenceFrequencyWeekly
當(dāng)type為EKRecurrenceFrequencyWeekly時(shí)诲锹,填充interval和days;
一:interval為2梭冠,days為星期一和星期四辕狰;也就是我要每隔兩周的星期一和星期四執(zhí)行一次
我們將會(huì)得到如下結(jié)果:
<__NSArrayM 0x60800044f660>(
2016-12-01 08:30:00 +0000,
2016-12-12 08:30:00 +0000,
2016-12-15 08:30:00 +0000,
2016-12-26 08:30:00 +0000,
2016-12-29 08:30:00 +0000
)
EKRecurrenceFrequencyMonthly
當(dāng)type為EKRecurrenceFrequencyWeekly時(shí),填充interval和monthDays控漠;
一:interval為1蔓倍,monthDays為6悬钳;也就是每一個(gè)月的6號(hào)執(zhí)行一次
我們得到:
<__NSArrayM 0x610000252150>(
2016-12-06 08:30:00 +0000
)
因?yàn)槲覀円?guī)定的時(shí)間只有12月,所以只有一個(gè)時(shí)間
EKRecurrenceFrequencyYearly
當(dāng)type為EKRecurrenceFrequencyWeekly時(shí)偶翅,填充interval默勾、monthDays和months,其中interval設(shè)置為1
一:monthDays為8聚谁,months為12母剥;也就是每年的12月8號(hào)執(zhí)行一次
我們會(huì)得到:
<__NSArrayM 0x618000453ef0>(
2016-12-08 08:30:00 +0000
)
結(jié)果當(dāng)然也是對(duì)的,到現(xiàn)在我上面的規(guī)則選擇界面就可以做出來了
補(bǔ)充
因?yàn)槲覀児こ痰囊?guī)則選擇界面還是比較簡(jiǎn)單的形导,所以就如上面所說就可以完成需求了环疼;當(dāng)然你也可以研究一些比較復(fù)雜的規(guī)則,不過一般上面這些已經(jīng)夠用了