XTreeTableView 다중 레벨 목록

5773 단어
이전에 한 프로젝트에서 귀속된 json 데이터를 다단계 목록으로 보여주고 마음대로 전개하여 회수할 수 있는 기능이 필요하다.이 기능을 실현할 때 가장 큰 문제는 데이터에 대한 해석과 데이터 간의 등급 관계 처리이다.최근에 이 기능을 생각하면 당시에는 어떤 개원 프로젝트의 계발을 받았는데 지금은 스스로 사고방식을 다시 정리하고 기억을 깊이 있게 한다.

1. 데이터 처리


우선 데이터에 대한 처리를 말씀드리겠습니다.서버에서 얻은 데이터는 json 데이터로 귀속되고 모든 목록의 등급이 확실하지 않기 때문에 어떤 것은 1층, 양측 데이터만 있고 어떤 것은 다층 데이터이기 때문에 이런 데이터는 우리가 어떻게 모델로 전환해야 하나요?!나의 해결 방법은 그다지 적당하지 않은 단어로'이에는 이'라고 형용하는데, 네가 귀속해서 데이터를 되돌려 주는 이상, 나도 같은 방법으로 데이터를 처리한다.다음은 구체적인 실현 데모를 살펴보겠습니다.
1. 서버에서 가져온 데이터는 대략 다음과 같다.
@{@"list": @[@{@"name": @"first",@"id": @1,
                    @"subList":@[@{@"name": @"second",@"id": @2},
                                             @{@"name": @"second",@"id": @2}]},
               @{@"name": @"first",@"id": @1,
                   @"subList": @[@{@"name": @"second",@"id": @2,
                                             @"subList": @[@{@"name": @"third",@"id": @3},
                                                                      @{@"name": @"third",@"id": @3}]},
                                             @{@"name": @"second",@"id": @2,
                                             @"subList": @[@{@"name": @"third",@"id": @3},
                                                                       @{@"name": @"third",@"id": @3}]}]},
                  @{@"name": @"first",@"id": @1,
                                             @"subList": @[@{@"name": @"second",@"id": @2},
                                                                       @{@"name": @"second",@"id": @2}]}]};

2. 그러면 우리는 어떻게 데이터 사전을 모델로 변환해야 합니까? 먼저 모델의 속성과 방법을 정의합니다.
@interface ListModel : NSObject
@property(nonatomic,copy)NSString *name;
//@property(nonatomic,copy)NSString *nameId;
@property(nonatomic,copy)NSNumber *nameId;
@property(nonatomic,copy)NSArray*subList;// ( : )
@property(nonatomic,assign)BOOL isExpand;// 
@property(nonatomic,weak)ListModel *superModel;// Model
@property(nonatomic,assign)int level;// , Model 
- (instancetype)initWithDict:(NSDictionary *)dict;
+ (instancetype)listModelWithDict:(NSDictionary *)dict;
@end

3. 다음이 중점이다. 다음은 initWithDict 방법을 실현한다. 이 방법에서 우리는 귀속 데이터를 처리하고 데이터를 귀속 모델로 전환할 것이다.
이로써 데이터에 대한 처리는 기본적으로 완성되었고 중점을 잡은 후에 데이터에 대한 처리 사고방식은 여전히 뚜렷하다.

2. tableView 봉인


1. 먼저 XTreeTableView의 개인 정보 초기화 방법을 설명합니다.
/**
 XTTreeTableView 
@param frame tableView 
@param data tableView 
@return XTTreeTableView
*/
-(instancetype)initWithFrame:(CGRect)frame withData:(NSArray *)data;

다음은 XTree TableView에서 살펴보겠습니다.m중 방법의 실현.
2. XTreeTableView의 개인 속성을 설명합니다.
@property (nonatomic , strong) NSArray *data;// ( Model)
@property (nonatomic , strong) NSMutableArray *tempData;// ( )

3. XTreeTableView를 만드는 방법은 다음과 같습니다.
- (instancetype)initWithFrame:(CGRect)frame withData:(NSArray *)data
{
    self = [super initWithFrame:frame style:UITableViewStyleGrouped];
    if (self) {
        self.dataSource = self;
        self.delegate = self;
        _data = data;
        _tempData = [NSMutableArray arrayWithArray:data];
}
    return self;
}

tableView를 초기화한 후에 우리는 tableView의 데이터 원본 방법을 실현해야 한다.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.tempData.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CELL_ID = @"XTTree";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CELL_ID];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CELL_ID];
    }
    ListModel *model = self.tempData[indexPath.row];
    cell.textLabel.text = model.name;
    return cell;
}

4. 다음은 tableView의 에이전트 방법을 실현합니다. 이것은 가장 중요한 것입니다. 앞에서 준비한 것은 모두 이 기능을 위한 것입니다.그가 실현한 사고방식은 우리가 어떤 셀을 클릭할 때 먼저 이 줄에 대응하는 모델을 얻어 이 모델에 있는subList에subModel이 있는지 판단하고 있으면 전개하고 회수하며 전개 속성에 대해 반대값parentModel을 취할 수 있다는 것이다.isExpand=!parentModel.isExpand;없으면 전개, 회수할 수 없다.
만약parentModel.isExpand=YES, 즉 목록을 펼치려면subModel을subList에서 꺼내서 보여야 할 데이터 원본 self에 삽입합니다.tempData의 상응하는 위치를 선택한 다음tableView의 상응하는 위치에cell을 삽입합니다.
if (parentModel.isExpand) {// 
    for (int i = 0; i < parentModel.subList.count; i ++) {
        ListModel *subModel = parentModel.subList[i];
        [self.tempData insertObject:subModel atIndex:endPosition];
        endPosition ++;
    }
    expand = YES;
}

만약에'parentModel.isExpand=NO', 목록을 회수합니다. 우리는subList의subModel을 self에서 가져옵니다.tempData에서 삭제하고 원하는 셀을 tableView에서 삭제합니다.
- (NSInteger)removeAllModelsAtSupModel:(ListModel *)supModel
{
    NSInteger startPosition = [self.tempData indexOfObject:supModel];
    CGFloat count;
    for (int i = 0; i < supModel.subList.count; i ++) {
        ListModel *model = supModel.subList[i];
        count ++;
        if (model.isExpand) {
            count += model.subList.count;
            model.isExpand = NO;
        }
    }
    NSInteger endPosition = startPosition + count + 1;//supModel.subList.count + 1;
    [self.tempData removeObjectsInRange:NSMakeRange(startPosition+1, count)];
    return endPosition;
}

요약:
처음 쓰는데 공부를 깊이 하기 위해 부족한 점이 있다면 많은 기대 부탁드립니다.Demo:XTTreeTableView

좋은 웹페이지 즐겨찾기