数据大造成的界面卡住问题

clipboard.png
clipboard.png
**我点击添加任务,然后再点击cell进入详情,发现需要卡顿一段时间才能进入详情,我添加任务做的操作是创建textView,让他成为第一相应,然后创建取消和添加俩个按钮,然后改变父视图的约束,以及隐藏添加任务的按钮,然后设置tableview的内边距以及设置让导航栏隐藏,
这个问题和https://segmentfault.com/q/10...里面的问题相似
问题在于数据少的时候不存在卡顿问题,但是数据多的话整个界面就会被卡死

望大神不吝赐教,由是感激**

具体代码如下

[addCard setTitle:@"添加任务" forState:UIControlStateNormal];

[addCard setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];

[addCard setTitleColor:[UIColor lightGrayColor] forState:UIControlStateHighlighted];

addCard.titleLabel.font = [UIFont systemFontOfSize:15];

addCard.backgroundColor = [UIColor clearColor];

self.addCards = addCard;

// [addCard addTarget:self action:@selector(addCard:) forControlEvents:UIControlEventTouchUpInside];

//使用ReactiveCocoa处理点击事件,相当于上面的addTarget:方法

//addCard点击事件

[[addCard rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {

NSLog(@"%ld",(unsigned long)self.unNetArr.count);

self.yesOrNo = NO;

//隐藏addCard

addCard.alpha = 0;

//输入框

UITextView *textView = ({

UITextView *view = [UITextView new];

[footer addSubview:view];

[view makeConstraints:^(MASConstraintMaker *make) {

make.left.equalTo(10);

make.top.equalTo(3);

make.right.equalTo(-10);

make.bottom.equalTo(-44+2);

}];

//因为footer变大,所以改变tableView的contentInset

listTableView.contentInset = UIEdgeInsetsMake(46, 0, 88, 0);

view.font = [UIFont systemFontOfSize:15];

//立即刷新视图

[self layoutIfNeeded];

view;

});

self.textView = textView;

//初始化add按钮

UIButton *add = ({

UIButton *view = [UIButton new];

view.contentHorizontalAlignment=UIControlContentHorizontalAlignmentCenter;

[view setTitle:NSLocalizedString(@"add", nil) forState:UIControlStateNormal];

[view setTitleColor:Global_trelloBlue forState:UIControlStateNormal];

[view setTitleColor:[UIColor lightGrayColor] forState:UIControlStateHighlighted];

[view setTitleEdgeInsets:UIEdgeInsetsMake(0, -40, 0, -80)];

[view.titleLabel setFont:[UIFont fontWithName:@"Arial-Bold" size:18]];

view.titleLabel.font = [UIFont systemFontOfSize:15];

[footer addSubview:view];

[view makeConstraints:^(MASConstraintMaker *make) {

make.right.equalTo(0);

make.bottom.equalTo(-1);

make.width.equalTo(120);

}];

[view sizeToFit];

//初始化后隐藏(为了动画效果)

view.alpha = 0;

//立即刷新

[self layoutIfNeeded];

//add点击事件,创建新的tast

[[view rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {

//textView判空

if (![textView.text isEqualToString:@""]) {

self.yesOrNo = NO;

AddTaskApi *api = AddTaskApi.new;

//如果在没有task的列添加新的task,t_sort传0

api.t_sort = @(0);

//都上传0

api.t_taskContent = textView.text;

api.t_projectId = @(_project_id.integerValue);

//当前列的id

api.t_panel_id = @(listTableView.model.id.integerValue);

NSLog(@"<><>%@",_project_id);

//判断是否有网

[GLobalRealReachability reachabilityWithBlock:^(ReachabilityStatus status) {

switch (status)

{

case RealStatusNotReachable:

{

NewTasklistModel *model = [[NewTasklistModel alloc]init];

model.unloading = YES;

model.t_taskContent = textView.text;

textView.text = nil;

model.t_sort = @"0";

model.t_id = [_project_id integerValue];

model.t_panel_id = listTableView.model.id;

model.page = idx;

[listTableView.model.task addObject:model];

[self.unNetArr addObject:model];

NSLog(@"%ld",(unsigned long)self.unNetArr.count);

//插入行

[listTableView insertRow:(listTableView.model.task.count-1)inSection:0 withRowAnimation:

UITableViewRowAnimationBottom];

//计算rowHeight

CGFloat rowHeight = [self tableView:listTableView heightForRowAtIndexPath:[NSIndexPath indexPathForRow:listTableView.model.task.count-1 inSection:0]];

//根据当前列高度和rowHeight决定列高度是否增加

//updateConstraints:方法更新autolayout

[listView updateConstraints:^(MASConstraintMaker *make) {

//增加新的rowHeight后list超出允许最大高度,之前不满最大高度

if (listTableView.cellTotalHeight > (kTotalCellMaxHeight+NavAndStatusBarHeight-_keyboardHeight-44) && (listTableView.cellTotalHeight-rowHeight) < (kTotalCellMaxHeight+NavAndStatusBarHeight-_keyboardHeight-44)) {

make.height.equalTo(listView.yyHeight+((kTotalCellMaxHeight+NavAndStatusBarHeight-_keyboardHeight-44)-(listTableView.cellTotalHeight-rowHeight)));

}

//增加新的rowHeight后list没有超过允许最大高度

if (listTableView.cellTotalHeight <= (kTotalCellMaxHeight+NavAndStatusBarHeight-_keyboardHeight-44)) {

make.height.equalTo(listView.yyHeight+rowHeight);

}

}];

//tableView滚动到最底部,显示新添加行

[listTableView scrollToRow:listTableView.model.task.count-1 inSection:0 atScrollPosition:UITableViewScrollPositionBottom animated:NO];

//autolayout动画

[self layoutIfNeeded];

// [listTableView reloadRow:listTableView.model.task.count-1 inSection:0 withRowAnimation:UITableViewRowAnimationBottom];

//改变原列的标题数量

UITextField *sourceListTableHeaderTF=(UITextField *)[self viewWithTag:[listTableView.model.id integerValue]];

sourceListTableHeaderTF.text=[NSString stringWithFormat:@"%@ %ld",listTableView.model.name,(unsigned long)listTableView.model.task.count];

break;

}

case RealStatusUnknown:

{

NewTasklistModel *model = [[NewTasklistModel alloc]init];

model.unloading = YES;

model.t_taskContent = textView.text;

textView.text = nil;

model.t_sort = @"0";

model.t_id = [_project_id integerValue];

model.t_panel_id = listTableView.model.id;

model.page = idx;

[listTableView.model.task addObject:model];

[self.unNetArr addObject:model];

//插入行

[listTableView insertRow:(listTableView.model.task.count-1)inSection:0 withRowAnimation:

UITableViewRowAnimationBottom];

//计算rowHeight

CGFloat rowHeight = [self tableView:listTableView heightForRowAtIndexPath:[NSIndexPath indexPathForRow:listTableView.model.task.count-1 inSection:0]];

//根据当前列高度和rowHeight决定列高度是否增加

//updateConstraints:方法更新autolayout

[listView updateConstraints:^(MASConstraintMaker *make) {

//增加新的rowHeight后list超出允许最大高度,之前不满最大高度

if (listTableView.cellTotalHeight > (kTotalCellMaxHeight+NavAndStatusBarHeight-_keyboardHeight-44) && (listTableView.cellTotalHeight-rowHeight) < (kTotalCellMaxHeight+NavAndStatusBarHeight-_keyboardHeight-44)) {

make.height.equalTo(listView.yyHeight+((kTotalCellMaxHeight+NavAndStatusBarHeight-_keyboardHeight-44)-(listTableView.cellTotalHeight-rowHeight)));

}

//增加新的rowHeight后list没有超过允许最大高度

if (listTableView.cellTotalHeight <= (kTotalCellMaxHeight+NavAndStatusBarHeight-_keyboardHeight-44)) {

make.height.equalTo(listView.yyHeight+rowHeight);

}

}];

//tableView滚动到最底部,显示新添加行

[listTableView scrollToRow:listTableView.model.task.count-1 inSection:0 atScrollPosition:UITableViewScrollPositionBottom animated:NO];

//autolayout动画

[self layoutIfNeeded];

//改变原列的标题数量

UITextField *sourceListTableHeaderTF=(UITextField *)[self viewWithTag:[listTableView.model.id integerValue]];

sourceListTableHeaderTF.text=[NSString stringWithFormat:@"%@ %ld",listTableView.model.name,(unsigned long)listTableView.model.task.count];

break;

}

default:

//发起请求

[api startWithCompletionBlockWithSuccess:^(YTKBaseRequest *request) {

SLog(@"<><>>>%@",request);

NewTasklistModel *model = request.responseModel;

model.unloading = NO;

//存在即失败(接口定义,只在失败时才返回status值)

if (model.status) {

}

else { //添加成功

textView.text = nil;

//更新数据源

[listTableView.model.task addObject:model];

//插入行

[listTableView insertRow:(listTableView.model.task.count-1)inSection:0 withRowAnimation:

UITableViewRowAnimationBottom];

//计算rowHeight

CGFloat rowHeight = [self tableView:listTableView heightForRowAtIndexPath:[NSIndexPath indexPathForRow:listTableView.model.task.count-1 inSection:0]];

//根据当前列高度和rowHeight决定列高度是否增加

//updateConstraints:方法更新autolayout

[listView updateConstraints:^(MASConstraintMaker *make) {

//增加新的rowHeight后list超出允许最大高度,之前不满最大高度

if (listTableView.cellTotalHeight > (kTotalCellMaxHeight+NavAndStatusBarHeight-_keyboardHeight-44) && (listTableView.cellTotalHeight-rowHeight) < (kTotalCellMaxHeight+NavAndStatusBarHeight-_keyboardHeight-44)) {

make.height.equalTo(listView.yyHeight+((kTotalCellMaxHeight+NavAndStatusBarHeight-_keyboardHeight-44)-(listTableView.cellTotalHeight-rowHeight)));

}

//增加新的rowHeight后list没有超过允许最大高度

if (listTableView.cellTotalHeight <= (kTotalCellMaxHeight+NavAndStatusBarHeight-_keyboardHeight-44)) {

make.height.equalTo(listView.yyHeight+rowHeight);

}

}];

//tableView滚动到最底部,显示新添加行

[listTableView scrollToRow:listTableView.model.task.count-1 inSection:0 atScrollPosition:UITableViewScrollPositionBottom animated:NO];

[self layoutIfNeeded];

//autolayout动画

//改变原列的标题数量

UITextField *sourceListTableHeaderTF=(UITextField *)[self viewWithTag:[listTableView.model.id integerValue]];

sourceListTableHeaderTF.text=[NSString stringWithFormat:@"%@ %ld",listTableView.model.name,(unsigned long)listTableView.model.task.count];

}

} failure:^(YTKBaseRequest *request) {

}];

break;

}

}];

}else{

self.yesOrNo = YES;

[footer updateConstraints:^(MASConstraintMaker *make) {

make.height.equalTo(44);

}];

//list减去footer增加的高度(在这里做是为了动效)

[listView updateConstraints:^(MASConstraintMaker *make) {

make.height.equalTo(listView.yyHeight-44);

}];

//tableView的contentInset还原

listTableView.contentInset = UIEdgeInsetsMake(46, 0, 44, 0);

//隐藏textView

textView.alpha = 0;

[UIView animateWithDuration:0.25 animations:^{

//cancel隐藏

view.alpha = 0;

//add隐藏

self.cancel.alpha = 0;

//addCard显示

addCard.alpha = 1;

[self.viewController.navigationController setNavigationBarHidden:NO animated:YES];

[self layoutIfNeeded];

}];

[textView resignFirstResponder];

}

}];

view;

});

self.addView = add;

//初始化cancel按钮

UIView *cancel = ({

UIButton *view = [UIButton new];

view.contentHorizontalAlignment=UIControlContentHorizontalAlignmentCenter;

[view setTitle:NSLocalizedString(@"cancel", nil) forState:UIControlStateNormal];

[view setTitleColor:Global_trelloBlue forState:UIControlStateNormal];

[view.titleLabel setFont:[UIFont fontWithName:@"Arial-Bold" size:18]];

[view setTitleColor:[UIColor lightGrayColor] forState:UIControlStateHighlighted];

[view setTitleEdgeInsets:UIEdgeInsetsMake(0, -80, 0, -40)];

view.titleLabel.font = [UIFont systemFontOfSize:15];

[footer addSubview:view];

[view makeConstraints:^(MASConstraintMaker *make) {

make.left.equalTo(0);

make.bottom.equalTo(-1);

make.width.equalTo(120);

}];

[view sizeToFit];

view.alpha = 0;

[self layoutIfNeeded];

//cancel点击事件

@weakify(self, view, textView, footer, listView, add, addCard)

[[view rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x)

{

@spanify(self, view, textView, footer, listView, add, addCard)

//footer高度还原

self.yesOrNo = YES;

[textView resignFirstResponder];

// list减去footer增加的高度(在这里做是为了动效)

[footer updateConstraints:^(MASConstraintMaker *make) {

make.height.equalTo(44);

}];

[listView updateConstraints:^(MASConstraintMaker *make) {

make.height.equalTo(listView.yyHeight);

}];

// tableView的contentInset还原

listTableView.contentInset = UIEdgeInsetsMake(46, 0, 44, 0);

// 隐藏textView

textView.alpha = 0;

[UIView animateWithDuration:0.5 animations:^{

//cancel隐藏

view.alpha = 0;

//add隐藏

add.alpha = 0;

//addCard显示

addCard.alpha = 1;

[self.viewController.navigationController setNavigationBarHidden:NO animated:NO];

[self layoutIfNeeded];

}];

}];

view;

回答:

你贴这么长的代码,怎么看啊。
这种问题的话,你应该看是哪里占用了比较长的时间。然后解决啊。
个人觉得tableView的刷新次数可能比较多的话,会影响性能,你可以看下,是不是tableView的代理方法在一直被调用呢?

回答:

。。。。。。。

回答:

代码写法逼格高的都看不懂了……

回答:

问题终于解决了 谢谢你们

回答:

响应式编程?

以上是 数据大造成的界面卡住问题 的全部内容, 来源链接: utcz.com/p/186112.html

回到顶部