UI_10 表视图的编辑、UITableViewController

不想你离开。 提交于 2020-04-07 10:04:22

     读取plist文件并将其内容显示到表视图上。并添加编辑(增加,删除)、移动cell的操作。

plist文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "
http://www.apple.com/DTDs/PropertyList-1.0.dtd
">
<plist version="1.0">
<dict>
  <key>北京</key>
        <array>
           <dict>
                     <key>area</key>
                      <string>100万</string>
                <key>name</key>
                      <string>海淀区</string>
         </dict>
            <dict>
            <key>area</key>
            <string>101万</string>
                   <key>name</key>
                      <string>朝阳区</string>
         </dict>
     </array>
   <key>新疆</key>
        <array>
           <dict>
            <key>area</key>
            <string>112万</string>
                   <key>name</key>
                      <string>乌鲁木齐</string>
        </dict>
            <dict>
            <key>area</key>
            <string>113万</string>
                   <key>name</key>
                      <string>哈密</string>
          </dict>
            <dict>
            <key>area</key>
            <string>114万</string>
                   <key>name</key>
                      <string>吐鲁番</string>
         </dict>
     </array>
</dict>
</plist>

结构图如下:



⼀、tableView编辑

     编辑的步骤如下:

  • 1、进入可编辑状态

  • 2、设置指定分区(section)中的行(row)是否可以被编辑

  • 3、设置指定分区(section)中的行(row)是什么类型的编辑样式

  • 4、编辑完成(一定要先操作数据,后操作UI)

//1、进入可编辑状态
- (
void)setEditing:(BOOL)editing animated:(BOOL)animated
{
    [
super setEditing:editing animated:animated];
   
    [
_tableView setEditing:editing animated:animated];
   
}

//2、设置指定分区(section)中的行(row)是否可以被编辑
- (
BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
   
if (!indexPath.section&&!indexPath.row) {
       
return NO;
    }
   
return YES;
}

//3、设置指定分区(section)中的行(row)是什么类型的编辑样式
- (
UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
   
if (indexPath.section==1) {
       
return UITableViewCellEditingStyleInsert;
    }
   
return UITableViewCellEditingStyleDelete;
}

//4、编辑完成(一定要先操作数据,后操作UI
- (
void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
   
switch (editingStyle) {
       
case UITableViewCellEditingStyleDelete:
           
NSLog(@"Delete");
           
//1.先删除数据
           
NSString *key=_keysArray[indexPath.section];
           
NSMutableArray *array = _allCityDic[key];
            [array
removeObjectAtIndex:indexPath.row];
           
           
//2.操作UI
            [tableView
deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft];
           
           
if (!array.count) {
               
//1.先操作数据
                [
_keysArray removeObject:key];
                [
_allCityDic removeObjectForKey:key];
               
//2.再操作UI
                [tableView
deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section] withRowAnimation:UITableViewRowAnimationBottom];
            }
           
           
           
break;
       
case UITableViewCellEditingStyleNone:
           
NSLog(@"None");
           
break;
       
case UITableViewCellEditingStyleInsert:
           
NSLog(@"Insert");
           
           
City *aCity = [[City alloc] init];
           
            aCity.
name = @"丰台区";
            aCity.
area = @"30";
           
           
//1.数据
           
NSString *key1 = _keysArray[indexPath.section];
           
NSMutableArray *cityArray = _allCityDic[key1];
            [cityArray
insertObject:aCity atIndex:indexPath.row];
           
           
//2.UI
            [tableView
insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
           
           
break;
       
default:
           
break;
    }

}

最后,不要忘了添加编辑按钮

    self.navigationItem.rightBarButtonItem = self.editButtonItem;



⼆、tableView移动

     步骤:

  • 1.让tableView处于可编辑状态(同上)

  • 2.设置指定的分区section中的行row是否可以被移动

  • 3.实现移动

  • 4.限制跨区移动

//1.tableView处于可编辑状态(同上)

//2.设置指定的分区section中的行row是否可以被移动
- (
BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
   
return YES;
}
//3.实现移动
//方法:保存-删除-插入
- (
void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
{
   
if (sourceIndexPath.row!=destinationIndexPath.row) {
       
NSString *key = _keysArray[sourceIndexPath.section];
       
NSMutableArray *citiesArray = _allCityDic[key];
       
//获取数组中要被移动的元素
       
City *aCity = citiesArray[sourceIndexPath.row];
       
//    //保存
       
//    [aCity retain];
       
//    //删除(必须retain)
       
//    [citiesArray removeObjectAtIndex:sourceIndexPath.row];
       
//    //移动
       
//    [citiesArray insertObject:aCity atIndex:destinationIndexPath.row];
       
//    [aCity release];
       
        [citiesArray
insertObject:aCity atIndex:destinationIndexPath.row];
        [citiesArray
removeObjectAtIndex:sourceIndexPath.row+1];
    }
   
}

//4.限制跨区移动
-(
NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath
{
   
//如果目的地与出发地位置在同一区
   
if (sourceIndexPath.section == proposedDestinationIndexPath.section) {
       
return proposedDestinationIndexPath;
    }
else {
       
return sourceIndexPath;
    }

}



三、UITableViewController

注意:

  • UITableViewController继承⾃UIViewController,⾃带⼀个tableView

  • self.view不是UIView⽽是UITableView

  • datasource和delegate默认都是self(UITableViewController)

  • 开发中只需要建⽴UITableViewController⼦类


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!