blog

iOSの開発 - 3レベルのディレクトリは、クリックすると、効果を拡大縮小する

コアコードは、このコードは、ネットワーク要求を模倣することです、その主な役割は、データモデルに値を割り当てることです。 コアコード2、このコードはセルのクリックイベント、セルの2番目のレベルの最初のレ...

Apr 27, 2020 · 3 min. read
シェア

このプロジェクトでは、3レベルのカタログを作成する必要があります。

  • レンダリングは以下の通り:

アイデア:全体は間違いなくUITableViewで、3レベルのカタログなので、ここでtableHeaderViewとsectionHeaderを使うのはあまり意味がないので、すべてcellを使っています。それでも、予想される2つの重要な問題があります。1つは、セルが第1レベルなのか、第2レベルなのか、第3レベルなのかを区別する方法、もう1つは、セルが拡大しているのか、縮小しているのかを区別する方法です。もうひとつは、セルが膨張しているのか収縮しているのかを区別する方法です。そこで、これらの問題を解決するためのプロパティを定義したモデル・クラスを作りました。

  • コアコード1、このコードはウェブリクエストを模倣し、主な役割はデータモデルに値を割り当てることです。
 //  
 for (NSInteger i = 0; i < array.count; i++) {
 QQLevelModel *model = [[QQLevelModel alloc] init];
 model.depict = array[i][@"depict"];
 model.firstIndex = i+1;
 [self.dataArray addObject:model];
 //  
 NSArray *secondLevelData = array[i][@"secondLevelData"];
 for (NSInteger j = 0; j < secondLevelData.count; j++) {
 QQLevelModel *model = [[QQLevelModel alloc] init];
 model.depict = secondLevelData[j][@"depict"];
 model.firstIndex = i+1;
 model.secondIndex = j+1;
 [self.dataArray addObject:model];
 NSArray *thirdLevelData = secondLevelData[j][@"thirdLevelData"];
 //  
 [thirdLevelData enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
 QQLevelModel *model = [[QQLevelModel alloc] init];
 model.firstIndex = i+1;
 model.secondIndex = j+1;
 model.thirdIndex = idx+1;
 model.depict = obj[@"depict"];
 [self.dataArray addObject:model];
 }];
 }
 }
  • コアコード2、このコードは、セルのクリックイベントは、最初の2つのレベルのセルをクリックすると、UITableViewが表示されますまたは効果の収縮。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; QQLevelModel *current_model = self.dataModel.dataArray[indexPath.row]; // クリックは、セルである場合 if (current_model.secondIndex == 0 && current_model.thirdIndex == 0) { current_model.isOpen = !current_model.isOpen; NSMutableArray *indexPathArray = @[].mutableCopy; [self.dataModel.dataArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { QQLevelModel *model = obj; BOOL is_belong = model.firstIndex == current_model.firstIndex; //現在のグループであるかどうか BOOL is_current = model.secondIndex == 0; //それは第一レベルのセルであるかどうか //現在のグループ化で、セルではない場合は、すべての隠された、閉じる if (is_belong && !is_current) { model.isShow = !current_model.isOpen; NSIndexPath *indexPath = [NSIndexPath indexPathForRow:idx inSection:0]; [indexPathArray addObject:indexPath]; } }]; [self reloadRowsAtIndexPaths:indexPathArray withRowAnimation:UITableViewRowAnimationFade]; return; } // クリックは、セカンダリセルである場合 if (current_model.thirdIndex == 0) { NSMutableArray *indexPathArray = @[].mutableCopy; [self.dataModel.dataArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { QQLevelModel *model = obj; BOOL is_belong = model.secondIndex == current_model.secondIndex && model.firstIndex == current_model.firstIndex; //現在のグループであるかどうか BOOL is_current = model.thirdIndex == 0; // それは二次セルであるかどうか //現在のグループ化で、セルの2番目のレベルではない場合は、すべての隠された if (is_belong && !is_current) { model.isShow = !model.isShow; NSIndexPath *indexPath = [NSIndexPath indexPathForRow:idx inSection:0]; [indexPathArray addObject:indexPath]; } }]; [self reloadRowsAtIndexPaths:indexPathArray withRowAnimation:UITableViewRowAnimationFade]; return; } }

、全体的なコードのロジックは複雑ではありません、あなたの仲間を歓迎し、交換し、一緒に学びます。

Read next

ES6 `...` 拡張/コレクション演算子の説明

私の理解では、()で囲むと一つの値に展開され、[]で囲むと配列に展開されます。 これはJAVAと同じで、入力数が不確定な場合の形式パラメータに使えます。

Apr 27, 2020 · 1 min read