一. 关于轮播图定时器的一些bug
在写自动轮播图时,定时器在手动拖拽轮播图时需要停止计时器,在结束拖拽后,在重新启动定时器。然而NSTime
并没有停止和重新启动的属性,只有销毁定时器。所以所谓的停止计时器的功能就得依靠销毁来实现,而重新启动就意味着重新定义一遍该定时器。就达到了停止与启动的效果。
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
if (scrollView.tag == 334) {
//停止计时器
[_scrollViewTimer invalidate];
}
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
if (scrollView.tag == 333) {
//重新启动定时器
_homeView.scrollViewTimer = [NSTimer scheduledTimerWithTimeInterval:4 target:self selector:@selector(autoRepeat) userInfo:nil repeats:YES];
}
}
- 后来写了一组
tableViewCell
后发现出现了新的问题,因为我的自动轮播图是写在tableView
的第一行单元格上的,而tableView
本身也是属于ScrollView
。所以在调用滚动视图的代理函数时,要进行tag
值的判断来决定在哪个控件上执行该协议函数。 - 在解决上述问题后,当我拖动
tableView
向下拉时,整个屏幕会变成空白。查询可得,在写轮播图的时候,轮播图下面的UIScrollView
的代理对象不能是MVC中的V,否则代码执行到协议事件函数时tableView
若手动滑动整个View
界面就会崩溃。由此看见,MVC设计模式的条理是十分清晰的,Controller
中就应该来负责与用户交互或者与View
的点击事件通信的。
二. 关于刷新新数据
我的想法是在tableView
的最后添加一个空白单元,这个单元格上就写那个刷新控件(小菊花)
self.activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:(UIActivityIndicatorViewStyleLarge)];
//设置小菊花的frame
self.activityIndicator.frame = CGRectMake(SIZE_WIDTH / 2, 20, 15, 15);
//设置小菊花颜色
self.activityIndicator.color = [UIColor blackColor];
//设置背景颜色
self.activityIndicator.backgroundColor = [UIColor clearColor];
//刚进入这个界面会显示控件,并且停止旋转也会显示,只是没有在转动而已,没有设置或者设置为YES的时候,刚进入页面不会显示
self.activityIndicator.hidesWhenStopped = YES;
- 当我拉动
tableView
时,如果我的拉到最后一行单元格(也就是显示小菊花的那行)时(需要判断坐标),我就开始进行旧数据的网络请求,利用通知传值将旧数据从Controller
传输到View
上。当网络请求成功时,我将单元格最后一行(有小菊花)之前的位置增加7行单元格,然后再进行刷新数据就 ok了。 - 这里要注意,当我们刷新
tableView
时,一定要放在主线程里进行。
NSLog(@"-----接收到更新过往记录通知------");
// 异步执行任务创建方法
dispatch_async(dispatch_get_main_queue(), ^{
self.homeView.beforeCellNumber += 7;
[self.homeView.homeTableView reloadData];
});