前面一篇博客,我使用了reloadData来刷新界面,但是这样没有动画效果,那么我这里通过insertRowsAtIndexPaths:withRowAnimation设置动画效果,希望对大家有所帮助。还是在前面的代码基础上面进行微调,点击右侧的BarButtonItem添加元素,这时候我需要添加到_infoArray数据源中的元素是顺序插入的,而不是添加在末尾,这就要求用算法来进行排序,关键代码如下,
@interface RootViewController ()<UITableViewDelegate,UITableViewDataSource>
{
//_infoArray是TableView的数据源
NSMutableArray *_infoArray;
//随机添加的数字都来自_numberArray
NSMutableArray *_numberArray;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
//设置导航栏右侧的按钮,并绑定点击事件
UIBarButtonItem *rightItem = [[UIBarButtonItem alloc] initWithTitle:@"Add" style:UIBarButtonItemStylePlain target:self action:@selector(addNumber)];
self.navigationItem.rightBarButtonItem = rightItem;
//初始化_numberArray,并且将0~99数字转换成NSNumber,然后加入数组
_numberArray = [[NSMutableArray alloc] initWithCapacity:3];
for(int i = 0;i < 100;i++)
{
NSNumber *tempNumber = [NSNumber numberWithInt:i];
[_numberArray addObject:tempNumber];
}
//初始化数据源数组_infoArray
NSNumber *num0 = [NSNumber numberWithInt:1];
NSNumber *num1 = [NSNumber numberWithInt:30];
NSNumber *num2 = [NSNumber numberWithInt:47];
NSNumber *num3 = [NSNumber numberWithInt:68];
NSNumber *num4 = [NSNumber numberWithInt:75];
NSNumber *num5 = [NSNumber numberWithInt:88];
_infoArray = [[NSMutableArray alloc] initWithObjects:num0,num1,num2,num3,num4,num5, nil];
}
这里我初始化了数据源_infoArray,其中的内容为{1,30,47,68,75,88}数字内容,点击导航栏右侧Add按钮,往数据源中顺序插入元素,其绑定的addNumber方法如下所示,
- (void)addNumber
{
int count = (int)[_numberArray count];
//0~count随机数
int randomIndex = rand()%count;
//随机从_numberArray中获取一个元素insertNumber
NSNumber *insertNumber = [_numberArray objectAtIndex:randomIndex];
int index = 0;
for (NSNumber *tempNumber in _infoArray) {
//将要插入的元素与数据源_infoArray中的元素进行大小比较
int insertInt = [insertNumber intValue];
int existInt = [tempNumber intValue];
//因为数据源是顺序排列的,所以如果要插入的数字小于_infoArray数据源中的某个值时候则插入数字
//index是用于记录要插入的位置的
if (insertInt<=existInt) {
[_infoArray insertObject:insertNumber atIndex:index];
NSMutableArray *indexPaths = [[NSMutableArray alloc] init];
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:index inSection:0];
[indexPaths addObject:indexPath];
[self performSelectorOnMainThread:@selector(insertTableViewRow:) withObject:indexPaths waitUntilDone:YES];
//这里是到主线程中刷新界面,因为现在就是在主线程,所以这段话有点多此一举,可以直接调用下面的代码
//[self insertTableViewRow:indexPaths];
//为什么需要一个break语句呢?因为如果不通过break停止for循环,则会出现插入错误。
break;
}
index++;
}
//为了不重复插入_numberArray中的数据,则要将已经插_infoArray数据源中的数据从原来的数组中删除
[_numberArray removeObject:insertNumber];
}
上面的方法就是顺序插入新的元素,同时也要在对应的theTableView行数插入新的row,通过performSelectorOnMainThread的代码在主线程中执行插入row,对应的-insertTableViewRow方法如下所示,
- (void)insertTableViewRow:(NSMutableArray *)indexPaths
{
[self.theTableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationAutomatic];
//UITableViewRowAnimationFade是一种渐变淡出的效果,这个在删除行的时候使用比较好,这里使用UITableViewRowAnimationAutomatic动画效果比较好
}
这样,我添加新的元素,更新界面的时候,就有了设置的UITableViewRowAnimationAutomatic或者UITableViewRowAnimationFade渐变的动画效果。