ios 控制器生命周期的周期时间是不是固定的

1406人阅读
&span style=&font-size:18&&时间控制器NSTimer可以实现定时器功能,即每隔一定时间执行具体函数,可以重复也可以只执行一次。&/span&
class DownloadManagerTableTableViewController: UITableViewController {
var timer : NSTimer?
override func viewDidLoad() {
super.viewDidLoad()
//页面显示之前设定定时器
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
self.timer = NSTimer.scheduledTimerWithTimeInterval(0.5, target: self, selector: &timerFired&, userInfo: nil, repeats: true)
//页面消失后关闭定时器
override func viewDidDisappear(animated: Bool) {
super.viewDidDisappear(animated)
guard let timer = self.timer
else { return }
timer.invalidate()
func timerFired () {
//print(&timer ticked&)
self.tableView.reloadData()
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:242537次
积分:2317
积分:2317
排名:第12777名
原创:25篇
评论:19条UINavigationController用来管理视图控制器,在多视图控制器中常用。它以栈的形式管理视图控制器,管理视图控制器个数理论上不受限制(实际受内存限制),push和pop方法来弹入弹出控制器,最多只能显示一个视图控制器,那就是处于栈顶的视图控制器。
一般情况下,UINavigationController最少管理一个控制器,即最少有一个根视图控制器或者叫做栈底视图控制器。当然也有例外,如果不给它添加视图控制器也不会报错,界面上也有视图,因为UINavigationController继承自UIViewController,也有自己的view,只不过默认情况下.view.backgroundColor为nil,即透明的。
二、常用函数
使用push方法能将某个控制器压入栈
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)
使用setViewControllers一次压入多个控制器vc1-&vc2-&vc3,会显示最后的控制器vc3(处于栈顶),代码如下:
UINavigationController *nav = [[UINavigationController alloc] init];
window.rootViewController =
// 创建3个测试控制器
UIViewController *vc1 = [[UIViewController alloc] init];
vc1.view.backgroundColor = [UIColor blueColor];
UIViewController *vc2 = [[UIViewController alloc] init];
vc2.view.backgroundColor = [UIColor redColor];
UIViewController *vc3 = [[UIViewController alloc] init];
vc3.view.backgroundColor = [UIColor greenColor];
// 最终会显示vc3
[nav setViewControllers:@[vc1,vc2,vc3] animated:YES];
使用pop方法可以移除栈顶控制器&
当一个控制器被pop后,控制器内存就被释放了(会调用deinit/dealloc函数):
- (UIViewController *)popViewControllerAnimated:(BOOL)
一层一层的返回不方便,可以直接回到指定的控制器VCA(处与VCA与栈顶之间的控制器全被释放),下面代码执行后,VC_A处于栈顶:
- (NSArray *)popToViewController:VC_A animated:(BOOL)
回到根控制器(栈底控制器):
-(NSArray *)popToRootViewControllerAnimated:(BOOL)
获取控制器
/// 当前管理的所有的控制器
@property(nonatomic,copy) NSArray&__kindof UIViewController *& *viewC
/// 栈顶控制器
@property(nullable, nonatomic,readonly,strong) UIViewController *topViewC
/// 当前可见的VC,可能是topViewController,也可能是当前topViewController present(modal)出来的VC,总而言之就是可见的VC
@property(nullable, nonatomic,readonly,strong) UIViewController *visibleViewC
注意,topViewController与visibleViewController大部分情况一样,也有可能不同
三、导航条
UINavigationController是做导航用的,具体的操作大部是由导航条来完成,导航条的使用就显得很重要。导航条的内容由控制器的navigationItem属性决定。&
1 navigationItem的属性
一般使用self.navigationItem.对应属性来获取属性,或者设置属性。或者使用self.navigationController获取到navigationController,再通过navigationController获取到想要设置的viewController
中间的标题文字
@property(nullable, nonatomic,copy) NSString *
中间标题视图
@property(nullable, nonatomic,strong) UIView *titleV
导航栏附加解释说明,如果设置了此字段,导航栏会高出30个点显示此字段在title正上方
@property(nullable,nonatomic,copy)
NSString *
自定义左上角的返回按钮
/// 直接设置
@property(nullable, nonatomic,strong) UIBarButtonItem *leftBarButtonI
大部分情况下,我们需要指定左边返回按钮距离左边框的距离,可以如下设定:
UIBarButtonItem *leftItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"gobackItem.png"] style:UIBarButtonItemStylePlain target:self action:@selector(backViewcontroller)];
UIBarButtonItem *fixedItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
// 设置边框距离,个人习惯设为-16,可以根据需要调节
fixedItem.width = -16;
self.navigationItem.leftBarButtonItems = @[fixedItem, leftItem];
下图为设置边框前后的差别:
子导航条后退按钮,假设通过VC1pushVC2,那么如果设置VC1.navigationItem.backBarButtonItem就会显示在VC2的左上角返回按钮;如果再设置VC2.navigationItem.leftBarButtonItem则会覆盖VC1的设置;如果VC1和VC2都没有设置,则会显示默认的backBarButtonItem。
@property(nullable,nonatomic,strong) UIBarButtonItem *backBarButtonI
自定义右上角的按钮,或多个按钮
@property(nullable, nonatomic,strong) UIBarButtonItem *rightBarButtonI
/// 一次设置多个按钮
@property(nullable,nonatomic,copy) NSArray&UIBarButtonItem *& *rightBarButtonI
2 设置navigationItem的字体格式
// 字体大小19,颜色为白色
[nav.navigationBar setTitleTextAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:19],NSForegroundColorAttributeName:[UIColor whiteColor]}];
四、UIToolBar
UINavigationController自带了一个工具栏,通过[self.navigationController setToolbarHidden:NO];来显示工具栏,工具栏中的内容可以通过viewController的toolbarItems来设置,显示的顺序和设置的NSArray中存放的顺序一致,每一个UIBarButtonItem对象都可以设定点击事件,可以使用系统提供的很多常用风格的对象,也可以根据需求进行自定义,下面举例使用系统提供的样式。
// 1 显示工具条
[self.navigationController setToolbarHidden:NO];
// 2 创建四个UIBarButtonItem
UIBarButtonItem *itemOne = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:nil action:nil];
UIBarButtonItem *itemTwo = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemSave target:nil action:nil];
UIBarButtonItem *itemThree = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:nil action:nil];
UIBarButtonItem *itemFour = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemSearch target:nil action:nil];
UIBarButtonItem *flexibleItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
// 3 添加到toolbarItems
vc.toolbarItems = @[itemOne,flexibleItem,itemTwo,flexibleItem,itemThree,flexibleItem,itemFour];
效果如下:
另外,UIToolBar使用的比较少,大部分情况下而是使用另一个导航控制器UITabBarController
五 UINavigationBar、UINavigationItem、UIToolbar与UIBarButtonItem四者关系
NavigaitonBar是导航栏,位于屏幕的上方,管理整个NavigationController的navigationItem,它类似navigationcontroller一样提供了一个栈来管理UINavigationItem,在编程时,一般只设置每个控制器的navigationItem属性
一个导航控制器管理多个视图控制器(多个视图控制器共享一个导航控制器),而一个导航控制器只有一个UINavigationBar,被管理的多个视图控制器共享这一个UINavigationBar,只要一个视图控制器改变了UINavigationBar的属性则影响是全局的。每个视图控制器都会有属于自己的UINavigationItem,系统会以懒加载的方式创建一个UINavigationItem显示在UINavigationBar中,改变UINavigationItem只会在当前控制器起作用,不会影响其它控制器。
Toolbar显示在屏幕底部,是导航控制器的工具栏,一个导航控制器只有一个,在任何被管理的视图控制器地方改变则会都改变。可以一次性添加多个UIBarButtonItem或按钮(包装成UIBarButtonItem后添加),有一个items数组属性。
UIBarButtonItem是UINavigationItem或者Toolbar具体的一个按钮。
六、UINavigationControllerDelegate
有两个常用的方法
// 一般用于传递参数,或者做一些其它处理
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)
阅读(...) 评论()iOSX Dev(318)
Cocoa框架(40)
Objective C(220)
NSDate对象用来表示一个具体的时间点。NSDate是一个类簇,我们所使用的NSDate对象,都是NSDate的私有子类的实体。NSDate存储的是GMT时间,使用的时候会根据 当前应用 指定的 时区 进行时间上的增减,以供计算或显示。
可以快速地获取的时间点有:
(当前时间点)
相对于1 January 2001, GMT的时间点
相对于1970的时间点
distantFuture
(不可达到的未来的某个时间点)
distantPast
(不可达到的过去的某个时间点
根据http://www.gnustep.org/实现的NSDate的版本:
&!-- lang: cpp --&
@interface NSDate : NSObject
&NSCoding, NSCopying&
NSTimeInterval _secondsSinceR
- (id) initWithTimeInterval:(NSTimeInterval) secsToBeAdded
sinceDate:(NSDate *) anotherD
相对于已知的某个时间点
- (id) initWithTimeIntervalSinceNow:(NSTimeInterval) secsToBeA
相对于当前时间
- (id) initWithTimeIntervalSince1970:(NSTimeInterval)
相对于1970年1月1日0时0分0秒
- (id) initWithTimeIntervalSinceReferenceDate:(NSTimeInterval)
相对于2001年1月1日0时0分0秒
可以看出,NSDate类确实只是一个相对的时间点,NSTimeInterval的单位是秒(s),_secondsSinceRef则说明NSDate对象是相对于ReferenceDate(日0时0分0秒)的一个时间点。
同时,根据Cocoa框架的设计原则,每个类都有一个“指定初始化方法”(指定初始化方法是参数最全,且其他初始化方法都会调用的初始化方法)。http://www.gnustep.org/实现的版本以方法:
- (id) initWithTimeIntervalSinceReferenceDate:(NSTimeInterval)
作为指定初始化方法,也就是说所有的时间点都转化为了相对referenceDate的时间点(时间点都是相对的,因为时间本身就是相对的)。
NSDate中最常用的方法一般是:
&!-- lang: cpp --&
NSDate *now = [NSDate date];
NSDate *dateFromNow = [NSDate dateWithTimeIntervalSinceNow:60];
NSDate *dateFromAnotherDate = [[NSDate alloc] initWithTimeInterval:60 sinceDate:dateFromNow];
NSTimeInterval timeInterval1 = [now timeIntervalSinceDate:dateFromNow];
NSTimeInterval timeInterval2 = [now timeIntervalSinceNow];
NSDate *distantPast = [NSDate distantPast];
NSDate *distantFuture = [NSDate distantFuture];
NSString *stringDate = @&12/31/9999&;
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@&MM/dd/yyyy&];
NSDate *dateCheck = [dateFormatter dateFromString:stringDate];
NSLog(@&Date = %@&, dateCheck);
Date = 1999-12-30 16:00:00 +0000
*iOS中用NSDate表示的时间只能在distantPast和distantFuture之间!
NSDateFormatter
NSDateFormatter是NSFormatter的子类,另,NSFormatter的用途是“将数据在字符串与特定类型的对象之间转换”,目前NSFormatter只有两个子类NSNumberFormatter和NSDateFormatter。
尽管NSDateFormatter提供了许多已定义好的时间格式,但是开发中开发人员更加喜欢自定义时间格式。
将时间字符串转换到NSDate对象,一般都是使用&年月日 时分秒”,数据库中的date类型基本上也是这样的时间类型。 格式一般为:yyyy-MM-dd HH:mm:ss。
注意:yyyy是小写的;大写的YYYY的意思有些不同——“将这一年中第一周的周日当作今年的第一天”,因此有时结果和yyyy相同,有时就会不同。
将NSDate对象转换成特定格式的字符串。
转换后的字符串会根据设备的“区域格式”,显示特定语言的结果。假如程序需要保证不同语言环境下显示一致,请注意这方面的问题,使用其他代替方法!
一言足以明志:
&!-- lang: cpp --&
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
[dateFormatter setDateFormat:@&'公元前/后:'G
'年份:'u'='yyyy'='yy '季度:'q'='qqq'='qqqq '月份:'M'='MMM'='MMMM '今天是今年第几周:'w '今天是本月第几周:'W
'今天是今天第几天:'D '今天是本月第几天:'d '星期:'c'='ccc'='cccc '上午/下午:'a '小时:'h'='H '分钟:'m '秒:'s '毫秒:'SSS
'这一天已过多少毫秒:'A
'时区名称:'zzzz'='vvvv '时区编号:'Z &];
NSLog(@&%@&, [dateFormatter stringFromDate:[NSDate date]]);
区域格式:美国
公元前/后:AD
年份:2013=2013=13 季度:3=Q3=3rd quarter 月份:8=Aug=August 今天是今年第几周:32 今天是本月第几周:2
今天是今天第几天:219 今天是本月第几天:7 星期:4=Wed=Wednesday 上午/下午:AM 小时:1=1 分钟:24 秒:32 毫秒:463
这一天已过多少毫秒:5072463
时区名称:China Standard Time=China Standard Time 时区编号:+0800
区域格式:中国
公元前/后:公元
年份: 季度:3=三季度=第三季度 月份:8=8月=8月 今天是今年第几周:32 今天是本月第几周:2
今天是今天第几天:219 今天是本月第几天:7 星期:4=周三=星期三 上午/下午:上午 小时:1=1 分钟:44 秒:30 毫秒:360
这一天已过多少毫秒:6270360
时区名称:中国标准时间=中国标准时间 时区编号:+0800
过多使用NSDateFormatter将影响程序的性能,且程序中NSDateFormatter对象的时间格式基本一致,所以使用NSDateFormatter的时候尽量使用单例模式。
!!!!奉上NSDateFormatter的时间格式:&
0~ (Millisecond of Day)
1~7 (Day of Week)
Sun/Mon/Tue/Wed/Thu/Fri/Sat
cccc: Sunday/Monday/Tuesday/Wednesday/Thursday/Friday/Saturday
1~31 (0 padded Day of Month)
1~366 (0 padded Day of Year)
1~7 (0 padded Day of Week)
Sun/Mon/Tue/Wed/Thu/Fri/Sat
EEEE: Sunday/Monday/Tuesday/Wednesday/Thursday/Friday/Saturday
1~5 (0 padded Week of Month, first day of week = Monday)
Julian Day Number (number of days since 4713 BC January 1)
BC/AD (Era Designator Abbreviated)
Before Christ/Anno Domini
1~12 (0 padded Hour (12hr))
0~23 (0 padded Hour (24hr))
1~24 (0 padded Hour (24hr)
0~11 (0 padded Hour (12hr))
1~12 (0 padded Month)
Jan/Feb/Mar/Apr/May/Jun/Jul/Aug/Sep/Oct/Nov/Dec
LLLL: January/February/March/April/May/June/July/August/September/October/November/December
0~59 (0 padded Minute)
1~12 (0 padded Month)
Jan/Feb/Mar/Apr/May/Jun/Jul/Aug/Sep/Oct/Nov/Dec
MMMM: January/February/March/April/May/June/July/August/September/October/November/December
1~4 (0 padded Quarter)
Q1/Q2/Q3/Q4
1st quarter/2nd quarter/3rd quarter/4th quarter
1~4 (0 padded Quarter)
Q1/Q2/Q3/Q4
1st quarter/2nd quarter/3rd quarter/4th quarter
0~59 (0 padded Second)
(rounded Sub-Second)
(0 padded Year)
(General GMT Timezone Abbreviation)
(General GMT Timezone Name)
1~53 (0 padded Week of Year, 1st day of week = Sunday, NB: 1st week of year starts from the last Sunday of last year)
1~5 (0 padded Week of Month, 1st day of week = Sunday)
y/yyyy: (Full Year)
yy/yyy: (2 Digits Year)
Y/YYYY: (Full Year, starting from the Sunday of the 1st week of year)
YY/YYY: (2 Digits Year, starting from the Sunday of the 1st week of year)
(Specific GMT Timezone Abbreviation)
(Specific GMT Timezone Name)
+0000 (RFC 822 Timezone)
NSTimeZone
**时区是一个地理名字,是为了克服各个地区或国家之间在使用时间上的混乱。
基本概念:
GMT 0:00 格林威治标准时间; UTC +00:00 校准的全球时间; CCD +08:00 中国标准时间 [来自百度百科]夏时制,英文&DaylightSavingTime”。夏季时将时区内的时间提前(一般为1小时),以节省资源,提高效率。使用夏时制期间,当前时区相对于GMT的时间偏移量会发生变化。在某些应用中可能需要考虑。任何时区都以GMT为基准,即,任何NSTimeZone对象所代表的时区都是相对于GMT的,这里的相对性是NSTimeZone中最重要的属性,我们称之为当前时区相对于GMT的偏移量。一旦知道了一个偏移量,便可以确定一个时区。在iOS中,偏移量是以&秒&为单位的。NSTimeZone是一个类簇,我们所使用的任何NSTimeZone对象都是NSTimeZone的私有子类。iOS中的时间类NSDate中存储的时间,都是相对于GMT的,我们使用NSDate时,会根据App的时区设置返回与时区对应的数据。iOS系统中的/usr/share/zoneinfo/目录中保存了所有的可根据 地理位置名称 或 时区别名 得到的时区信息。时区别名都是与具体的地理位置一一对应的。(已越狱的童鞋请看)iOS中的时区表示方法:GMT+0800 GMT-0800。(+:东区 -:西区 08:小时数 00:分钟数)。 GMT+0830就是指比GMT早8小时外加30分钟的时区。
由方法理解NSTimeZone
+ (NSArray *)knownTimeZoneN
+ (NSDictionary *)abbreviationD
+ (id)timeZoneWithName:(NSString *)tzN
+ (id)timeZoneWithAbbreviation:(NSString *)
+ (id)timeZoneForSecondsFromGMT:(NSInteger)
NSTimeZone的属性变量(猜想):
NSString *_
NSString *
代码实例:
时区对时间的影响
&!-- lang: cpp --&
[NSTimeZone setDefaultTimeZone:[NSTimeZone timeZoneWithAbbreviation:@&GMT+0900&]];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@&yyyy-MM-dd HH:mm:ss&];
NSDate *now = [NSDate date];
NSLog(@&now:%@&, [dateFormatter stringFromDate:now]);
dateFormatter.timeZone = [NSTimeZone timeZoneWithAbbreviation:@&GMT+0800&];
NSLog(@&now:%@&, [dateFormatter stringFromDate:now]);
添加中国标准时间名称缩写
// 设置并获取时区的缩写
NSMutableDictionary *abbs = [[NSMutableDictionary alloc] init];
[abbs setValuesForKeysWithDictionary:[NSTimeZone abbreviationDictionary]];
[abbs setValue:@&Asia/Shanghai& forKey:@&CCD&];
[NSTimeZone setAbbreviationDictionary:abbs];
NSLog(@&abbs:%@&, [NSTimeZone abbreviationDictionary]);
夏天了!注意夏时制!
&!-- lang: cpp --&
// 因为“夏时制”而产生的方法
- (NSInteger)secondsFromGMTForDate:(NSDate *)aD
- (NSString *)abbreviationForDate:(NSDate *)aD
- (BOOL)isDaylightSavingTimeForDate:(NSDate *)aD
- (NSTimeInterval)daylightSavingTimeOffsetForDate:(NSDate *)aDate NS_AVAILABLE(10_5, 2_0);
- (NSDate *)nextDaylightSavingTimeTransitionAfterDate:(NSDate *)aDate NS_AVAILABLE(10_5, 2_0);
若你只开发中国区的应用,需要保证用户修改当前语言环境时应用的显示不发生变化。而像NSDateFormatter这样的类,会根据设备的设置,自动返回不同语言的数据。为了保证返回数据的语言一致,我们需要设置NSLocale。
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@&zh&];
NSDateFormatter *secondDateFormatter = [[NSDateFormatter alloc] init];
[secondDateFormatter setDateFormat:@&cccc&];
secondDateFormatter.locale =
NSDate *date = [NSDate date];
NSLog(@&%@&, [secondDateFormatter stringFromDate:date]);
当然,像上面的需求很罕见。
作为大家都不常用的一个类,NSLocale类是将与国家和语言相关的信息进行简单的组合,包括货币,文学方面的信息。&
货币:货币的国际名称(人民币的国际货币名称是CNY);货币符号(人民币的国际货币符号是?)&
文学:标点符号,文字的书写顺序(左右顺序),引用的起止符号等等&
若做金融一类的应用可能会用到NSLocale这个类。
这个类稍微了解即可。
NSCalendar + NSDateComponents
历法能使人类确定每一日再无限的时间中的确切位置并记录历史。日历,历法,一般历法都是遵循固定的规则的,具有周期性。日历都是已知的或可预测的。任何一种具体的历法,首先必须明确规定起始点,即开始计算的年代,这叫“纪元”;以及规定一年的开端,这叫“岁首”。此外,还要规定每年所含的日数,如何划分月份,每月有多少天等等。NSCalendar对世界上现存的常用的历法进行了封装,既提供了不同历法的时间信息,又支持日历的计算。表示的时间默认以公历(即阳历)为参考,可以通过设置calendar属性变量获得特定历法下的时间表示。是独立与任何历法的,它只是时间相对于某个时间点的时间差;是进行日历计算的基础。NSDateComponents将时间表示成适合人类阅读和使用的方式,通过NSDateComponents可以快速而简单地获取某个时间点对应的“年”,“月”,“日”,“时”,“分”,“秒”,“周”等信息。当然一旦涉及了年月日时分秒就要和某个历法绑定,因此NSDateComponents必须和NSCalendar一起使用,默认为公历。NSDateComponents除了像上面说的表示一个时间点外,还可以表示时间段,例如:两周,三个月,20年,7天,10分钟,50秒等等。时间段用于日历的计算,例如:获取当前历法下,三个月前的某个时间点。可以说,要获取某个时间点在某个历法下的表示,需要NSDateComponents;要计算当前时间点在某个历法下对应的一个时间段前或后的时间点,需要NSDateComponents。NSDateComponents返回的day, week, weekday, month, year这一类数据都是从1开始的。因为日历是给人看的,不是给计算机看的,从0开始就是个错误。
NSDateComponents实例化的方式
&!-- lang: cpp --&
NSCalendar *greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *dateComponents = [greCalendar components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit | NSWeekCalendarUnit | NSWeekdayCalendarUnit | NSWeekOfMonthCalendarUnit | NSWeekOfYearCalendarUnit fromDate:[NSDate date]];
NSLog(@&year(年份): %i&, dateComponents.year);
NSLog(@&quarter(季度):%i&, dateComponents.quarter);
NSLog(@&month(月份):%i&, dateComponents.month);
NSLog(@&day(日期):%i&, dateComponents.day);
NSLog(@&hour(小时):%i&, dateComponents.hour);
NSLog(@&minute(分钟):%i&, dateComponents.minute);
NSLog(@&second(秒):%i&, dateComponents.second);
NSLog(@&weekday(星期):%i&, dateComponents.weekday);
NSLog(@&week(该年第几周):%i&, dateComponents.week);
NSLog(@&weekOfYear(该年第几周):%i&, dateComponents.weekOfYear);
NSLog(@&weekOfMonth(该月第几周):%i&, dateComponents.weekOfMonth);
若获取dateComponents对象时,设置components的时候未添加NSYearCalendarUnit,dateComponents.year将返回错误的数值,其他的也一样,所以使用NSDateComponents表示时间时,要确保需要使用的数据都在componets中添加了。
&!-- lang: cpp --&
NSCalendar *greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *dateComponentsForDate = [[NSDateComponents alloc] init];
[dateComponentsForDate setDay:6];
[dateComponentsForDate setMonth:5];
[dateComponentsForDate setYear:2004];
NSDate *dateFromDateComponentsForDate = [greCalendar dateFromComponents:dc];
NSDateComponents *dateComponentsAsTimeQantum = [[NSDateComponents alloc] init];
[dateComponentsForDate setDay:6];
NSDate *dateFromDateComponentsAsTimeQantum = [greCalendar dateByAddingComponents:dateComponentsAsTimeQantum toDate:[NSDate date] options:0];
先定义一个遵循某个历法的日历对象
NSCalendar *greCalendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
根据两个时间点,定义NSDateComponents对象,从而获取这两个时间点的时差
NSDateComponents *dateComponents = [greCalendar components:NSYearCalendarUnit fromDate:[NSDate dateWithTimeIntervalSince1970:0] toDate:[NSDate date] options:0];
NSLog(@&number of years:%i&, dateComponents.year);
NSCalendar中比较重要的方法和概念
firstWeekday
firstWeekday是大家比较容易浑淆的东西。
大家在使用dateComponents.weekday获取某天对应的星期时,会发现,星期日对应的值为1,星期一对应的值为2,星期二对应的值为3,依次递推,星期六对应的值为7,这与我们平时理解的方式不一样。然后,我们就开始找是不是可以设置这种对应关系。终于,我们在NSCalendar中发现了firstWeekday这个变量,从字面意思上看貌似就是我们寻找的那个东西。可是,设置过firstWeekday后,我们又发现完全没有作用,真是郁闷啊!其实,大家不必郁闷,因为郁闷也没用,iOS中规定的就是周日为1,周一为2,周二为3,周三为4,周四为5,周五为6,周六为7,无法通过某个设置改变这个事实的,只能在使用的时候注意一下这个规则了。那firstWeekday是干什么用的呢?大家设置一下firstWeekday,再获取一下dateComponents.weekOfYear或dateComponents.weekOfMonth,看看返回的数据是否发生了变化。firstWeekday的作用确实是修改当前历法中周的起始位置,但是不能修改周日对应的数值,只能修改一年或一个月中周的数量,以及周的次序。
-(NSRange)rangeOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)
答疑解惑:
typedef struct _NSRange {
NSUInteger
NSUInteger
我们大致可以理解为:某个时间点所在的“小单元”,在“大单元”中的数量(返回值range的location属性变量的值一般是错误的)。例如:
当前时间对应的月份中有几天
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit inUnit:NSMonthCalendarUnit forDate:[NSDate date]].
当前时间对应的月份中有几周(前面说到的firstWeekday会影响到这个结果)
[[NSCalendar currentCalendar] rangeOfUnit:NSWeekCalendarUnit inUnit:NSMonthCalendarUnit forDate:[NSDate date]].
-(NSUInteger)ordinalityOfUnit:(NSCalendarUnit)smaller inUnit:(NSCalendarUnit)larger forDate:(NSDate *)
我们大致可以理解为:某个时间点所在的“小单元”,在“大单元”中的位置(从1开始)。例如:
&!-- lang: cpp --&
[[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekOfYearCalendarUnit inUnit:NSYearCalendarUnit forDate:self];
[[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekCalendarUnit inUnit:NSYearCalendarUnit forDate:[NSDate date]];
[[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekOfMonthCalendarUnit inUnit:NSYearCalendarUnit forDate:self];
[[NSCalendar currentCalendar] ordinalityOfUnit:NSWeekCalendarUnit inUnit:NSMonthCalendarUnit forDate:[NSDate date]];
在这里:NSWeekOfYearCalendarUnit, NSWeekOfMonthCalendarUnit与NSWeekCalendarUnit的使用结果相同,为了避免浑淆,建议在此处使用NSWeekCalendar,而定义NSDateComponents时使用NSWeekOfYearCalendarUnit和NSWeekOfMonthCalendarUnit。
-(BOOL)rangeOfUnit:(NSCalendarUnit)unit startDate:(NSDate *)datep interval:(NSTimeInterval&)tip forDate:(NSDate *)
我们大致可以理解为:“某个时间点”所在的“单元”的起始时间,以及起始时间距离“某个时间点”的时差(单位秒)。例如:
NSDate *startDateOfY
NSDate *startDateOfM
NSDate *startDateOfW
NSDate *startDateOfD
NSTimeInterval TIOfY
NSTimeInterval TIOfM
NSTimeInterval TIOfW
NSTimeInterval TIOfD
[[NSCalendar currentCalendar] rangeOfUnit:NSYearCalendarUnit startDate:&startDateOfYear interval:&TIOfYear forDate:[NSDate date]];
[[NSCalendar currentCalendar] rangeOfUnit:NSMonthCalendarUnit startDate:&startDateOfMonth interval:&TIOfMonth forDate:[NSDate date]];
[[NSCalendar currentCalendar] rangeOfUnit:NSWeekCalendarUnit startDate:&startDateOfWeek interval:&TIOfWeek forDate:[NSDate date]];
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&startDateOfDay interval:&TIOfDay forDate:[NSDate date]];
NSLog(@&firstDateOfYear:%@, FirstDateOfMonth:%@, FirstDateOfWeek:%@, FirstDateOfDay:%@&, startDateOfYear, startDateOfMonth, startDateOfWeek, startDateOfDay);
NSLog(@&TIOfYear:%f, TIOfMonth:%f, TIOfWeek:%f, TIOfDay:%f&, TIOfYear, TIOfMonth, TIOfWeek, TIOfDay);
关于NSCalendar和NSDateComponents的介绍暂时说到这里。&
到目前为止,已经将iOS开发中关于时间的基本知识介绍完毕,欠缺之处请各位积极批评。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:311112次
积分:4270
积分:4270
排名:第5539名
原创:45篇
转载:500篇
评论:12条
(3)(2)(3)(5)(5)(2)(6)(4)(1)(4)(3)(2)(3)(17)(29)(6)(35)(30)(8)(5)(1)(5)(8)(17)(3)(7)(25)(45)(2)(12)(2)(13)(1)(8)(2)(19)(24)(18)(8)(3)(5)(1)(1)(5)(31)(26)(3)(24)(11)(17)(3)(11)(9)}

我要回帖

更多关于 ios 控制器的生命周期 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信