您现在的位置是:首页» 软件教程» scheduled time,schedule timer

scheduled time,schedule timer

2024-04-12 03:52:15
今天小编为大家分享Windows系统下载、Windows系统教程、windows相关应用程序的文章,希望能够帮助到大家! NSTimer*timer= [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(a

今天小编为大家分享Windows系统下载、Windows系统教程、windows相关应用程序的文章,希望能够帮助到大家!

NSTimer*timer= [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(action:) userInfo:nil repeats:NO];

TimerInterval:执行之前等待的时间。比如设置成1.0,就代表1秒后执行方法

注意:调用创建方法后,target对象的计数器会加1,直到执行完毕,自动减1。如果是循环执行的话,就必须手动关闭,否则可以不执行释放方法。

存在延迟:不管是一次性的还是周期性的timer的实际触发事件的时间,都会与所加入的RunLoop和RunLoop Mode有关,如果此RunLoop正在执行一个连续性的运算,timer就会被延时出发。重复性的timer遇到这种情况,如果延迟超过了一个周期,则会在延时结束后立刻执行,并按照之前指定的周期继续执行。

必须加入Runloop:使用上面的创建方式,会自动把timer加入MainRunloop的NSDefaultRunLoopMode中。如果使用以下方式创建定时器,就必须手动加入Runloop:

NSTimer*timer= [NSTimer timerWithTimeInterval:5 target:self selector:@selector(timerAction) userInfo:nil repeats:YES];

[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

displayLink= [CADisplayLink displayLinkWithTarget:self selector:@selector(handleDisplayLink:)];

[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

当把CADisplayLink对象add到runloop中后,selector就能被周期性调用,类似于重复的NSTimer被启动了;执行invalidate操作时,CADisplayLink对象就会从runloop中移除,selector调用也随即停止,类似于NSTimer的invalidate方法。**

屏幕刷新时调用:CADisplayLink是一个能让我们以和屏幕刷新率同步的频率将特定的内容画到屏幕上的定时器类。CADisplayLink以特定模式注册到runloop后,每当屏幕显示内容刷新结束的时候,runloop就会向CADisplayLink指定的target发送一次指定的selector消息, CADisplayLink类对应的selector就会被调用一次。所以通常情况下,按照iOS设备屏幕的刷新率60次/秒

延迟:iOS设备的屏幕刷新频率是固定的,CADisplayLink在正常情况下会在每次刷新结束都被调用,精确度相当高。但如果调用的方法比较耗时,超过了屏幕刷新周期,就会导致跳过若干次回调调用机会。

如果CPU过于繁忙,无法保证屏幕60次/秒的刷新率,就会导致跳过若干次调用回调方法的机会,跳过次数取决CPU的忙碌程度。

使用场景:从原理上可以看出,CADisplayLink适合做界面的不停重绘,比如视频播放的时候需要不停地获取下一帧用于界面渲染。

NSInteger类型的值,用来设置间隔多少帧调用一次selector方法,默认值是1,即每帧都调用一次。

readOnly的CFTimeInterval值,表示两次屏幕刷新之间的时间间隔。需要注意的是,该属性在target的selector被首次调用以后才会被赋值。selector的调用间隔时间计算方式是:调用间隔时间= duration× frameInterval。

dispatch_time_t popTime= dispatch_time(DISPATCH_TIME_NOW, delayInSeconds* NSEC_PER_SEC);

dispatch_after(popTime, dispatch_get_main_queue(), ^(void){

NSTimeInterval period= 1.0;//设置时间间隔

dispatch_queue_t queue= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_source_t _timer= dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);

dispatch_source_set_timer(_timer, dispatch_walltime(NULL, 0), period* NSEC_PER_SEC, 0);//每秒执行

dispatch_source_set_event_handler(_timer, ^{

1>.要想使用scrollView必须做两件事

2). contentInset(额外增加的滚动区域)

3). bounces(设置UIScrollView是否需要弹簧效果)

4). crollEnabled(设置UIScrollView是否能滚动)

5). showsHorizontalScrollIndicator(是否显示水平滚动条)

6). showsVerticalScrollIndicator(是否显示垂直滚动条)

1).监听思想:B监听A发生了什么事情

2).通知思想:A发生了一些事情,要通知B去做

*声明协议*设置代理对象self.scrollView.delegate= self;*实现协议方法

2).代理监听scrollView的拖拽事件

//开始拖拽-(void)scrollViewWillBeginDragging:(UIScrollView*)scrollView;//结束拖拽-(void)scrollViewDidEndDragging:(UIScrollView*)scrollView willDecelerate:(BOOL)decelerate;// scrollView滚动时执行-(void)scrollViewDidScroll:(UIScrollView*)scrollView

*成为UIScrollView的代理()*设置缩放对象(通过viewForZoomingInScrollView方法)*设置缩放为范围(maximumZoomScale、minimumZoomScale)

1>. self.timer= [NSTimer scheduledTimerWithTimeInterval:1.f target:self selector:@selector(方法) userInfo:nil repeats:YES];当另一个scrollView运行时,会停止定时器的scrollView,只能执行一个scrollView.

2>. self.timer= [NSTimer timerWithTimeInterval:1.f target:self selector:@selector(方法) userInfo:nil repeats:YES]; [[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];

*定义protocol(两种optional[代理对象可不实现]、required[代理对象必须实现])

*增加代理属性(weak)@property(weak, nonatomic) id<LFAppInfoViewDelegate> delegate;

*给代理发消息,调用代理的方法(需要判断代理对象是否实现了该方法,不判断调用后(编译时不会)会报错)注意:定义协议的名称命名[类名+Delegate]、协议方法的命名规范[方法名称需要去掉前缀,并且将自己作为参数]

*实现协议方法(本例是在代理对象[控制器]添加一个UILabel)

1. UITableView需要设置数据源才能显示数据

1>.会向数据源查询一共多少组,每组多少行,每行显示什么数据

2>.数据源必须遵守UITableViewDateSource协议

-(NSInteger)numberOfSectionsInTableView:(UITableView*)tableView{}第section组有多少行

-(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section{}每一行显示什么内容

-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath{}第section组头部显示什么标题-(NSString*)tableView:(UITableView*)tableView titleForHeaderInSection:(NSInteger)section{}第section组底部显示什么标题

-(NSString*)tableView:(UITableView*)tableView titleForFooterInSection:(NSInteger)section{}当每一行的cell的高度不一致的时候就使用代理方法设置cell的高度

-(CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath{}当每一行的cell高度一致的时候使用属性设置cell的高度

self.tableView.rowHeight= 60;可以优化内存的可变数组定义

NSMutableArray*models= [NSMutableArray arrayWithCapacity:(NSUInteger)]

2>.cell.detailTextLabel.text介绍

3>.cell.imageView.image图片

4>.cell.accessoryView辅助视图

5>.cell.accessoryView自定义辅助视图

6>.cell.backgroundView设置cell的背景颜色

1).通过backgroundColor和 backgroundView都可以设置cell的背景

2).但是backgroundView的优先级比 backgroundColor的高

3).所以如果同时设置了backgroundColor和backgroundView, backgroundView会盖住backgroundColor

7>.cell.selectedBackgroundView设置选中状态的背景

1>. tableview.separatorStyle设置分割线样式

2>. tableview.separatorColor设置分割线颜色自定义颜色

[UIColor colorWithRed:色值/255.f green:色值/255.f blue:色值/255.f alpha:色值/255.f];

获取屏幕宽度: [UIScreen mainScreen].bounds.size.width;

3>. tableview.tableHeaderView设置tableView的头部视图一般用于放广告

4>. tableview.tableFooterView设置tableView的底部视图一般用于放置加载更多按钮

5>. [self.tableView reloadData];刷新表格//刷新指定行

NSIndexPath*path= [NSIndexPath indexPathForRow:row inSection:0]; [self.tableView reloadRowsAtIndexPaths:@[path] withRowAnimation:UITableViewRowAnimationRight];

1>.先去缓存池中查找是否有满足条件的Cell UITableViewCell*cell= [tableView dequeueReusableCellWithIdentifier:identifier];

2>.如果缓存池中没有符合条件的cell,就自己创建一个Cell if(nil== cell){ cell= [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier];}

3>.创建Cell,并且设置一个唯一的标记: identifier注:定义变量 NSString*identifier推荐用 static定义静态局部变量,不推荐用宏.

1>.-(void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath{}//当某一行被选中的时候调用

2>.-(void)tableView:(UITableView*)tableView didDeselectRowAtIndexPath:(NSIndexPath*)indexPath{}//当某一行取消选中的时候调用

3>. UIAlertView的一些属性和代理方法

1). UIAlertView*alert= [[UIAlertView alloc] initWithTitle:@"修改数据" message:nil delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];//创建一个弹窗

2). alert.alertViewStyle= UIAlertViewStyle...;//设置alert的样式,让alert显示出uitextfield

3). UITextField*textField= [alert textFieldAtIndex:0];//获取alert中的textfield

5).-(void)alertView:(UIAlertView*)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{}// alertView的按钮被点击的时候就会调用

1>.纯代码:每个cell子控件的个数和位置不一样

2>.通过xib: cell一样且固定的界面加载xib的方式:

1). [[[NSBundle mainBundle] loadNibNamed:@"xib名" owner:nil options:nil] firstObject];

2).UINib*nib= [UINib nibWithNibName:@"xib名" bundle:nil]; UIView*view= [[nib instantiateWithOwner:nil options:nil]firstObject]; 3>.延迟调用 dispatch_after(dispatch_time(DISPATCH_TIME_NOW,(int64_t)(3.0* NSEC_PER_SEC)), dispatch_get_main_queue(), ^{}); 4>.init方法只有通过代码创建控件的时候才会调用; awakeFromNib方法在控件通过xib或者storyboard创建的时候才会调用

5>.协议规范协议名称:控件名称+ Delegate协议方法名称:控件名称去掉前缀+含义在协议方法中将自己(触发发放的)控件传出去的目的是方便用于区分哪个控件触发了该方法

6>.代码创建的子控件,添加到contentView中 [self.contentView addSubview:子控件];

7>.计算文字宽高 CGSize*maxSize= CGSizeMake(300, MAXFLOAT);//设置文字范围 NSDictionary*dict=@{NSFontAttributeName: font};//字体//如果将来计算的文字的范围超出了指定的范围,返回的就是指定的范围//如果将来计算的文字的范围小于指定的范围,返回的就是真实的范围 CGSize size= [NSString*str boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:dict context:nil].size;//计算文字宽高

8>.通过代码自定义cell的方法

1).新建一个继承自UITableViewCell的类

2).重写initWithStyle:reuseIdentifier:方法添加所有需要显示的子控件(不需要设置子控件的数据和frame,子控件要添加到contentView中)进行子控件一次性的属性设置(有些属性只需要设置一次,比如字体\固定的图片)

3).提供2个模型数据模型:存放文字数据\图片数据 frame模型:存放数据模型\所有子控件的frame\cell的高度 4).cell拥有一个frame模型(不要直接拥有数据模型)

5).重写frame模型属性的setter方法:在这个方法中设置子控件的显示数据和frame

6).frame模型数据的初始化已经采取懒加载的方式(每一个cell对应的frame模型数据只加载一次)

1>.通知中心(NSNotificationCenter)每一个应用程序都有一个通知中心(NSNotificationCenter)实例,专门负责协助不同对象之间的消息通信创建通知中心 NSNotificationCenter*center= [NSNotificationCenter defaultCenter];

2>.一个完整的通知一般包含3个属性:-(NSString*)name;//通知的名称-(id)object;//通知发布者(是谁要发布通知)-(NSDictionary*)userInfo;//一些额外的信息(通知发布者传递给通知接收者的信息内容)

3>.初始化一个通知(NSNotification)对象+(instancetype)notificationWithName:(NSString*)aName object:(id)anObject;+(instancetype)notificationWithName:(NSString*)aName object:(id)anObject userInfo:(NSDictionary*)aUserInfo;-(instancetype)initWithName:(NSString*)name object:(id)object userInfo:(NSDictionary*)userInfo;

4>.通知中心(NSNotificationCenter)提供了相应的方法来发布通知-(void)postNotification:(NSNotification*)notification;//发布一个notification通知,可在notification对象中设置通知的名称、通知发布者、额外信息等-(void)postNotificationName:(NSString*)aName object:(id)anObject;//发布一个名称为aName的通知,anObject为这个通知的发布者-(void)postNotificationName:(NSString*)aName object:(id)anObject userInfo:(NSDictionary*)aUserInfo;//发布一个名称为aName的通知,anObject为这个通知的发布者,aUserInfo为额外信息

5>.注册通知监听器(Observer)-(void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString*)aName object:(id)anObject; observer:监听器,即谁要接收这个通知 aSelector:收到通知后,回调监听器的这个方法,并且把通知对象当做参数传入 aName:通知的名称。如果为nil,那么无论通知的名称是什么,监听器都能收到这个通知 anObject:通知发布者。如果为anObject和aName都为nil,监听器都收到所有的通知

6>.取消注册通知监听器通知中心不会保留(retain)监听器对象,在通知中心注册过的对象,必须在该对象释放前取消注册。否则,当相应的通知再次出现时,通知中心仍然会向该监听器发送消息。因为相应的监听器对象已经被释放了,所以可能会导致应用崩溃-(void)removeObserver:(id)observer;-(void)removeObserver:(id)observer name:(NSString*)aName object:(id)anObject;一般在监听器销毁之前取消注册(如在监听器中加入下列代码):-(void)dealloc{//[super dealloc];非ARC中需要调用此句 [[NSNotificationCenter defaultCenter] removeObserver:self];}

利用通知和代理都能完成对象之间的通信

代理:一对一关系(1个对象只能告诉另1个对象发生了什么事情)

通知:多对多关系(1个对象能告诉N个对象发生了什么事情, 1个对象能得知N个对象发生了什么事情)

8.键盘通知 UIKeyboardWillShowNotification//键盘即将显示 UIKeyboardDidShowNotification//键盘显示完毕 UIKeyboardWillHideNotification//键盘即将隐藏 UIKeyboardDidHideNotification//键盘隐藏完毕 UIKeyboardWillChangeFrameNotification//键盘的位置尺寸即将发生改变 UIKeyboardDidChangeFrameNotification//键盘的位置尺寸改变完毕附带跟键盘有关的额外信息(字典),字典常见的key如下: UIKeyboardFrameBeginUserInfoKey//键盘刚开始的frame UIKeyboardFrameEndUserInfoKey//键盘最终的frame(动画执行完毕后) UIKeyboardAnimationDurationUserInfoKey//键盘动画的时间 UIKeyboardAnimationCurveUserInfoKey//键盘动画的执行节奏(快慢) 9.其他 1>.子控件不显示排错方法

6).查看夫控件有没有以上几点但凡在init方法中获取到的frame都是0-(void)layoutSubviews{ [super layoutSubviews];//该方法在控件的frame被改变的时候就会调用//该方法一般用于调整子控件的位置} 2>.//已经被添加到父视图上的时候会调用-(void)didMoveToSuperview{}//即将被添加到父视图上的时候会调用-(void)willMoveToSuperview:(UIView*)newSuperview{}

3> UITextField中添加左右视图 self.textField.leftView= [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 0)];//设置左边视图的显示模式 self.textField.leftViewMode= UITextFieldViewModeAlways; self.textField.rightView= [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 0)];//设置右边视图的显示模式 self.textField.rightViewMode= UITextFieldViewModeAlways;

4>.//设置btn中的图片不填充整个imageview btn.imageView.contentMode= UIViewContentModeCenter;//超出范围的图片不要剪切// btn.imageView.clipsToBounds= NO; btn.imageView.layer.masksToBounds= NO;

wwW.Xtw.Com.cN系统网专业的PC、手机系统开发下载平台,HarmonyOS系统、安卓、OS、windows电脑重装系统在线下载安装,操作系统平台技术学习,攻略教程,技术交流。

免责声明:本文中引用的各种信息及资料(包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主体(包括但不限于公司、媒体、协会等机构)的官方网站或公开发表的信息。内容仅供参考使用,不准确地方联系删除处理!

联系邮箱:773537036@qq.com

标签: 区别 ios