접기tableView의 실현

이 일기는 자신의 필기인데, 자신에게 보여준 것이고, 너무 게으르고 정리도 하지 않았다.간단하지만 복사해서 붙여넣었어요.이것은 접힌tableView의 간단한 실현이다. 주요한 사고방식은 여러 개의 섹션, 각각의 섹션 아래에 여러 개의 로즈가 있고 섹션 헤더는 1층으로 할 수 있으며 섹션에 대응하는 로즈는 접이층으로 할 수 있다.Rows의 확장과 접기를 실현합니다.
  • 접는tableView 구현
  • SectionHeaderView 재사용
  • 모델 및 데이터 처리
  • 코드
    Controller.h
    #import "WMSTableViewControllerBase.h"
    
    @class WMSBinInventory;@class WMSBinLot;
    
    NS_ASSUME_NONNULL_BEGIN
    
    /// Cell
    @interface WMSBinInventoryCell : UITableViewCell
    
    @property (nonatomic, strong) UILabel *expDateLabel;    // PurchaseTrans.ExpirationDate label
    @property (nonatomic, strong) UILabel *batchCodeLabel; // PurchaseTrans.BatchCode lable
    @property (nonatomic, strong) UILabel *inventoryLabel; // BinLots.Inventory label
    
    @property (nonatomic, strong) WMSBinLot *binLot;
    
    @end
    
    
    /// Section header
    @interface WMSBinInventoryTableSctionView : UITableViewHeaderFooterView
    
    @property (nonatomic, strong) WMSBinInventory *inventory;
    
    @property (nonatomic) NSInteger section;
    
    @property (nonatomic, copy) void(^SectionUpBlackBtnCallBack)(UIButton *sender, NSInteger section);
    
    @end
    
    
    /// Controller
    @interface WMSProductBinInventoryViewController : WMSTableViewControllerBase
    
    - (instancetype)init NS_UNAVAILABLE;
    - (instancetype)initWithProductID:(NSString *)productID
                          productName:(NSString *)productName;
    
    @property (nonatomic, copy, readonly) NSString *productID;
    @property (nonatomic, copy, readonly) NSString *productName;
    
    @end
    
    
    /// Model
    @interface WMSBinLot : NSObject
    
    @property (nonatomic, copy) NSString *expirationDate; // PurchaseTrans.ExpirationDate
    @property (nonatomic, copy) NSString *batchCode;      // PurchaseTrans.BatchCode
    @property (nonatomic, copy) NSString *inventory;      // BinLots.Inventory
    
    @end
    
    @interface WMSBinInventory : NSObject
    
    @property (nonatomic, copy) NSString *bin;             // Bins.Bin
    @property (nonatomic, copy) NSString *binZone;         // BinZones.BinZone
    @property (nonatomic, copy) NSString *capacity;        // Bins.Capacity
    @property (nonatomic, copy) NSString *pickPending;     // BinInventories.PickPending
    @property (nonatomic, copy) NSString *inventory;       // BinInventories.Inventory
    @property (nonatomic, copy) NSString *displayInventory;// The show num of BinInventories.Inventory.
    @property (nonatomic, copy) NSMutableArray <WMSBinLot *> *binLotArray;
    
    @property (nonatomic) BOOL hiddenDownBtn; // Whether to show the down button in section heaser. If do not any binlots data, the button will be hidden.
    @property (nonatomic) BOOL showRows;    // Whether to show rows details. Detault is NO.
    
    - (instancetype)initWithAttributes:(NSDictionary *)dict;
    
    @end
    
    NS_ASSUME_NONNULL_END
    

    Controller.m
    #import "WMSProductBinInventoryViewController.h"
    
    #define kWMSBinInventoryTableSctionViewIdentifier @"WMSBinInventoryTableSctionViewIdentifier"
    
    
    @interface WMSBinInventoryCell ()
    
    @property (nonatomic, strong) UIView *leftLine;
    @property (nonatomic, strong) UIView *rightLine;
    @property (nonatomic, strong) UIView *centerLine;
    
    @end
    
    @implementation WMSBinInventoryCell
    
    - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
        if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
                    
            self.expDateLabel = [[UILabel alloc] init];
            self.expDateLabel.textColor = [UIColor lightGrayColor];
            self.expDateLabel.font = [UIFont systemFontOfSize:12.0];
            self.expDateLabel.textAlignment = NSTextAlignmentLeft;
            [self addSubview:self.expDateLabel];
            
            self.batchCodeLabel = [[UILabel alloc] init];
            self.batchCodeLabel.textColor = [UIColor lightGrayColor];
            self.batchCodeLabel.font = [UIFont systemFontOfSize:12.0];
            self.batchCodeLabel.textAlignment = NSTextAlignmentLeft;
            [self addSubview:self.batchCodeLabel];
            
            self.inventoryLabel = [[UILabel alloc] init];
            self.inventoryLabel.textColor = [UIColor lightGrayColor];
            self.inventoryLabel.font = [UIFont systemFontOfSize:12.0];
            self.inventoryLabel.textAlignment = NSTextAlignmentLeft;
            [self addSubview:self.inventoryLabel];
            
            self.leftLine = [[UIView alloc] init];
            self.leftLine.backgroundColor = [UIColor lightGrayColor];
            [self insertSubview:self.leftLine aboveSubview:self.expDateLabel];
            
            self.rightLine = [[UIView alloc] init];
            self.rightLine.backgroundColor = [UIColor lightGrayColor];
            [self insertSubview:self.rightLine aboveSubview:self.inventoryLabel];
            
            self.centerLine = [[UIView alloc] init];
            self.centerLine.backgroundColor = [UIColor lightGrayColor];
            [self insertSubview:self.centerLine aboveSubview:self.batchCodeLabel];
        }
        return self;
    }
    
    - (void)layoutSubviews {
        [super layoutSubviews];
        
        self.expDateLabel.frame = CGRectMake(16, 0, (CGRectGetWidth(self.frame)-64)/3, CGRectGetHeight(self.frame));
        
        self.batchCodeLabel.frame = CGRectMake(16+CGRectGetMaxX(self.expDateLabel.frame), CGRectGetMinY(self.expDateLabel.frame), CGRectGetWidth(self.expDateLabel.frame), CGRectGetHeight(self.expDateLabel.frame));
        
        self.inventoryLabel.frame = CGRectMake(16+CGRectGetMaxX(self.batchCodeLabel.frame), CGRectGetMinY(self.expDateLabel.frame), CGRectGetWidth(self.expDateLabel.frame), CGRectGetHeight(self.expDateLabel.frame));
        
        self.leftLine.frame = CGRectMake(0, 0, 0.5, CGRectGetHeight(self.frame));
        self.rightLine.frame = CGRectMake(CGRectGetWidth(self.frame), 0, 0.5, CGRectGetHeight(self.frame));
        self.centerLine.frame = CGRectMake(CGRectGetMaxX(self.leftLine.frame), CGRectGetHeight(self.frame)-0.5, CGRectGetWidth(self.frame), 0.5);
    }
    
    - (void)setBinLot:(WMSBinLot *)binLot
    {
        _binLot = binLot;
        
        self.expDateLabel.text = binLot.expirationDate;
        self.batchCodeLabel.text = binLot.batchCode;
        self.inventoryLabel.text = binLot.inventory;
    }
    
    - (void)setFrame:(CGRect)frame
    {
        NSInteger insert = 20;
        frame.origin.x += insert;
        frame.size.width -= 2 * insert;
        
        [super setFrame:frame];
    }
    
    @end
    
    
    @interface WMSBinInventoryTableSctionView ()
    
    @property (nonatomic, strong) UIView *titleView;
    @property (nonatomic, strong) UILabel *binZoneTitleLabel;
    @property (nonatomic, strong) UILabel *capacityTitleLabel;
    @property (nonatomic, strong) UILabel *pickPendingTitleLabel;
    @property (nonatomic, strong) UILabel *binInventoryTitleLabel;
    
    @property (nonatomic, strong) UIView *detailView;
    @property (nonatomic, strong) UIButton *downBtn;
    @property (nonatomic, strong) UILabel *binBinZoneLabel;     // Bins.Bin - BinZons.BinZone
    @property (nonatomic, strong) UILabel *capacityLabel;       // Bins.Capacity
    @property (nonatomic, strong) UILabel *pickPendingLabel;    // BinInventories.PickPending
    @property (nonatomic, strong) UILabel *inventoryLabel;      // BinInventories.Inventory
    
    
    @property (nonatomic, strong) UIView *rowsTitleView;
    @property (nonatomic, strong) UILabel *dateTitleLabel;
    @property (nonatomic, strong) UILabel *batchCodeTitleLabel;
    @property (nonatomic, strong) UILabel *inventoryTitleLabel;
    
    @end
    
    @implementation WMSBinInventoryTableSctionView
    
    - (instancetype)initWithReuseIdentifier:(NSString *)reuseIdentifier
    {
        if (self = [super initWithReuseIdentifier:reuseIdentifier])
        {
            self.contentView.backgroundColor = [UIColor whiteColor];
            
            
            self.titleView = [[UIView alloc] init];
            self.titleView.backgroundColor = [[UIColor lightGrayColor] colorWithAlphaComponent:0.3];
            [self addSubview:self.titleView];
            
            self.binZoneTitleLabel = [[UILabel alloc] init];
            self.binZoneTitleLabel.text = @"Bin Zone";
            self.binZoneTitleLabel.font = [UIFont systemFontOfSize:15.0];
            self.binZoneTitleLabel.textColor = [UIColor blackColor];
            [self.titleView addSubview:self.binZoneTitleLabel];
            
            self.capacityTitleLabel = [[UILabel alloc] init];
            self.capacityTitleLabel.text = @"Capacity";
            self.capacityTitleLabel.font = [UIFont systemFontOfSize:15.0];
            self.capacityTitleLabel.textColor = [UIColor blackColor];
            [self.titleView addSubview:self.capacityTitleLabel];
            
            self.pickPendingTitleLabel = [[UILabel alloc] init];
            self.pickPendingTitleLabel.text = @"Pick Pending";
            self.pickPendingTitleLabel.font = [UIFont systemFontOfSize:15.0];
            self.pickPendingTitleLabel.textColor = [UIColor blackColor];
            [self.titleView addSubview:self.pickPendingTitleLabel];
            
            self.binInventoryTitleLabel = [[UILabel alloc] init];
            self.binInventoryTitleLabel.text = @"Inventory";
            self.binInventoryTitleLabel.font = [UIFont systemFontOfSize:15.0];
            self.binInventoryTitleLabel.textColor = [UIColor blackColor];
            [self.titleView addSubview:self.binInventoryTitleLabel];
    
            
            
            
            self.detailView = [[UIView alloc] init];
            self.detailView.backgroundColor = [[UIColor lightGrayColor] colorWithAlphaComponent:0.1];
            [self addSubview:self.detailView];
                    
            self.downBtn = [UIButton buttonWithType:UIButtonTypeCustom];
            [self.downBtn setImage:[UIImage imageNamed:@"PlusIcon_Down"] forState:UIControlStateNormal];
            [self.downBtn setImage:[UIImage imageNamed:@"MinusIcon_Up"] forState:UIControlStateSelected];
            [self.downBtn addTarget:self action:@selector(downBtnAction:) forControlEvents:UIControlEventTouchUpInside];
            self.downBtn.hidden = YES;
            [self.detailView addSubview:self.downBtn];
            
            self.binBinZoneLabel = [[UILabel alloc] init];
            self.binBinZoneLabel.textColor = [UIColor blackColor];
            self.binBinZoneLabel.font = [UIFont systemFontOfSize:14.0];
            [self.detailView addSubview:self.binBinZoneLabel];
            
            self.capacityLabel = [[UILabel alloc] init];
            self.capacityLabel.textColor = [UIColor blackColor];
            self.capacityLabel.font = [UIFont systemFontOfSize:14.0];
            [self.detailView addSubview:self.capacityLabel];
            
            self.pickPendingLabel = [[UILabel alloc] init];
            self.pickPendingLabel.textColor = [UIColor blackColor];
            self.pickPendingLabel.font = [UIFont systemFontOfSize:14.0];
            [self.detailView addSubview:self.pickPendingLabel];
            
            self.inventoryLabel = [[UILabel alloc] init];
            self.inventoryLabel.textColor = [UIColor blackColor];
            self.inventoryLabel.font = [UIFont systemFontOfSize:14.0];
            [self.detailView addSubview:self.inventoryLabel];
            
            
            
            self.rowsTitleView = [[UIView alloc] init];
            self.rowsTitleView.backgroundColor = [[UIColor lightGrayColor] colorWithAlphaComponent:0.4];
            self.rowsTitleView.layer.borderColor = [UIColor lightGrayColor].CGColor;
            self.rowsTitleView.layer.borderWidth = 0.5;
            [self insertSubview:self.rowsTitleView aboveSubview:self.detailView];
            
            self.dateTitleLabel = [[UILabel alloc] init];
            self.dateTitleLabel.textColor = [UIColor blackColor];
            self.dateTitleLabel.font = [UIFont systemFontOfSize:13.0];
            self.dateTitleLabel.text = @"  Date";
            [self.rowsTitleView addSubview:self.dateTitleLabel];
            
            self.batchCodeTitleLabel = [[UILabel alloc] init];
            self.batchCodeTitleLabel.textColor = [UIColor blackColor];
            self.batchCodeTitleLabel.font = [UIFont systemFontOfSize:13.0];
            self.batchCodeTitleLabel.text = @"Batch";
            [self.rowsTitleView addSubview:self.batchCodeTitleLabel];
    
            self.inventoryTitleLabel = [[UILabel alloc] init];
            self.inventoryTitleLabel.textColor = [UIColor blackColor];
            self.inventoryTitleLabel.font = [UIFont systemFontOfSize:13.0];
            self.inventoryTitleLabel.text = @"Inventory";
            [self.rowsTitleView addSubview:self.inventoryTitleLabel];
        }
        return self;
    }
    
    - (void)layoutSubviews {
        [super layoutSubviews];
        
        self.titleView.frame = CGRectMake(0, 0, CGRectGetWidth(self.frame), 40);
        
        self.binZoneTitleLabel.frame = CGRectMake(16, 0, (CGRectGetWidth(self.frame)-32)/4, CGRectGetHeight(self.titleView.frame));
        self.capacityTitleLabel.frame = CGRectMake(CGRectGetMaxX(self.binZoneTitleLabel.frame), CGRectGetMinY(self.binZoneTitleLabel.frame), CGRectGetWidth(self.binZoneTitleLabel.frame), CGRectGetHeight(self.binZoneTitleLabel.frame));
        self.pickPendingTitleLabel.frame = CGRectMake(CGRectGetMaxX(self.capacityTitleLabel.frame), CGRectGetMinY(self.binZoneTitleLabel.frame), CGRectGetWidth(self.binZoneTitleLabel.frame), CGRectGetHeight(self.binZoneTitleLabel.frame));
        self.binInventoryTitleLabel.frame = CGRectMake(CGRectGetMaxX(self.pickPendingTitleLabel.frame), CGRectGetMinY(self.binZoneTitleLabel.frame), CGRectGetWidth(self.binZoneTitleLabel.frame), CGRectGetHeight(self.binZoneTitleLabel.frame));
        
        self.detailView.frame = CGRectMake(0, CGRectGetMaxY(self.titleView.frame), CGRectGetWidth(self.frame), 60);
        self.downBtn.frame = CGRectMake(16, CGRectGetHeight(self.detailView.frame)*0.5-10, 20, 20);
        self.binBinZoneLabel.frame = CGRectMake(CGRectGetMaxX(self.downBtn.frame) + 8, 0, (CGRectGetWidth(self.frame)-52)/4, CGRectGetHeight(self.detailView.frame));
        self.capacityLabel.frame = CGRectMake(CGRectGetMaxX(self.binBinZoneLabel.frame), CGRectGetMinY(self.binBinZoneLabel.frame), CGRectGetWidth(self.binBinZoneLabel.frame), CGRectGetHeight(self.binBinZoneLabel.frame));
        self.pickPendingLabel.frame = CGRectMake(CGRectGetMaxX(self.capacityLabel.frame), CGRectGetMinY(self.binBinZoneLabel.frame), CGRectGetWidth(self.capacityLabel.frame), CGRectGetHeight(self.binBinZoneLabel.frame));
        self.inventoryLabel.frame = CGRectMake(CGRectGetMaxX(self.pickPendingLabel.frame), CGRectGetMinY(self.binBinZoneLabel.frame), CGRectGetWidth(self.capacityLabel.frame), CGRectGetHeight(self.binBinZoneLabel.frame));
        
        
        self.rowsTitleView.frame = CGRectMake(20, CGRectGetMaxY(self.detailView.frame) + 10, CGRectGetWidth(self.frame)-40, 40);
        self.dateTitleLabel.frame = CGRectMake(0, 0, CGRectGetWidth(self.rowsTitleView.frame)/3, 40);
        self.batchCodeTitleLabel.frame = CGRectMake(CGRectGetMaxX(self.dateTitleLabel.frame), 0, CGRectGetWidth(self.dateTitleLabel.frame), CGRectGetHeight(self.dateTitleLabel.frame));
        self.inventoryTitleLabel.frame = CGRectMake(CGRectGetMaxX(self.batchCodeTitleLabel.frame), 0, CGRectGetWidth(self.dateTitleLabel.frame), CGRectGetHeight(self.dateTitleLabel.frame));
    }
    
    - (void)setInventory:(WMSBinInventory *)inventory
    {
        _inventory = inventory;
        
        self.binBinZoneLabel.text = [NSString stringWithFormat:@"%@ - %@",inventory.bin,inventory.binZone];
        self.binBinZoneLabel.numberOfLines = 2;
        
        self.capacityLabel.text = inventory.capacity;
        self.pickPendingLabel.text = inventory.pickPending;
        
        self.inventoryLabel.text = inventory.displayInventory;
        
        self.downBtn.hidden = inventory.hiddenDownBtn;
        self.downBtn.selected = inventory.showRows;
        self.rowsTitleView.hidden = !inventory.showRows;
    }
    
    - (void)setSection:(NSInteger)section
    {
        _section = section;
    }
    
    - (void)downBtnAction:(UIButton *)sender
    {
        if (self.SectionUpBlackBtnCallBack) {
            self.SectionUpBlackBtnCallBack(sender, self.section);
        }
    }
    
    @end
    
    
    @interface WMSProductBinInventoryViewController ()
    
    @property (nonatomic, copy, readwrite) NSString *productID;
    @property (nonatomic, copy, readwrite) NSString *productName;
    
    @property (nonatomic, strong) NSMutableArray <WMSBinInventory *> *dataSource;
    
    @end
    
    @implementation WMSProductBinInventoryViewController
    
    - (NSMutableArray *)dataSource {
        if (!_dataSource) {
            _dataSource = [[NSMutableArray alloc] init];
        }
        return _dataSource;
    }
    
    - (instancetype)initWithProductID:(NSString *)productID productName:(NSString *)productName {
        if (self = [super init]) {
            self.productID = productID;
            self.productName = productName;
            self.title = self.productName;
        }
        return self;
    }
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
        
        [self initViews];
        
        [self requestBinLotsData];
    }
    
    - (void)initViews {
        
        self.view.backgroundColor = [UIColor whiteColor];
        
        self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
        self.tableView.sectionFooterHeight = 20;
        [self.tableView registerClass:[WMSBinInventoryTableSctionView class] forHeaderFooterViewReuseIdentifier:kWMSBinInventoryTableSctionViewIdentifier];
    }
    
    - (void)requestBinLotsData
    {
    	// ...
    
        // Debug data
        for (int i = 0; i < 10; i++)
        {
            NSArray *binLot = @[
            @{@"ExpirationDate":@"2020.10.28",
                                     @"BatchCode":@"",
                                     @"BinLotInventory":@"1"
            },
            @{@"ExpirationDate":@"2020.10.29",
                                     @"BatchCode":@"",
                                     @"BinLotInventory":@"9"
            }];
            NSDictionary *dict = @{@"Bin":@"jc",
                                   @"BinZone":@"C3",
                                   @"Capacity":@"102",
                                   @"PickPending":@"15",
                                   @"BinInventory":@"10.000",
                                   @"DisplayInventory":@"10",
                                   @"BinLots":binLot,
            };
            WMSBinInventory *inventory = [[WMSBinInventory alloc] initWithAttributes:dict];
            [self.dataSource addObject:inventory];
        }
        [self.tableView reloadData];
    }
    
    #pragma mark - Request
    
    - (void)requestFinished:(ASIHTTPRequest *)request{
        
        [self hideProgressView];
        
        NSString *responseString = [request responseString];
    
        if (request.tag == WMSHttpRequestTypeVPGetBinInventories)
        {
            NSData *jsonData = [responseString dataUsingEncoding:NSUTF8StringEncoding];
            NSError *err;
            NSDictionary *response = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err];
            NSDictionary *data = response[@"data"];
            if (err == nil && data.count > 0)
            {
                for (NSDictionary *dict in data)
                {
                    WMSBinInventory *inventory = [[WMSBinInventory alloc] initWithAttributes:dict];
                    [self.dataSource addObject:inventory];
                }
                [self.tableView reloadData];
            }
            else {
    
            }
        }
    }
    
    - (void)requestFailed:(ASIHTTPRequest *)request {
        
        [self hideProgressView];
        
        [self showAlertViewOfRequestFailed];
    }
    
    #pragma mark - TableView
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {
        return self.dataSource.count;
    }
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        WMSBinInventory *inventory = self.dataSource[section];
        return (inventory.showRows) ? inventory.binLotArray.count : 0;
    }
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        static NSString *cellIdentifier = @"WMSProductBinInventoryViewController_UITableViewCell";
        WMSBinInventoryCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
        if (cell == nil) {
            cell = [[WMSBinInventoryCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
        }
        WMSBinInventory *inventory = self.dataSource[indexPath.section];
        WMSBinLot *binLot = inventory.binLotArray[indexPath.row];
        cell.binLot = binLot;
        return cell;
    }
    - (CGFloat)tableView:( UITableView *)tableView heightForHeaderInSection:( NSInteger )section
    {
        WMSBinInventory *inventory = self.dataSource[section];
        if (inventory.showRows) {
            return 40 + 60 + 50;
        }
        return 40 + 60; // Section titles height + Detail num height.
    }
    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        return 40;
    }
    - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
        WMSBinInventoryTableSctionView *sectionView = [tableView dequeueReusableHeaderFooterViewWithIdentifier:kWMSBinInventoryTableSctionViewIdentifier];
        if (sectionView == nil) {
            sectionView = [[WMSBinInventoryTableSctionView alloc] initWithReuseIdentifier:kWMSBinInventoryTableSctionViewIdentifier];
        }
        [sectionView setSection:section];
        [sectionView setInventory:self.dataSource[section]];
        
        __weak typeof(self)weakSelf = self;
        sectionView.SectionUpBlackBtnCallBack = ^(UIButton * _Nonnull sender, NSInteger section) {
                    
            WMSBinInventory *inventory = self.dataSource[section];
            inventory.showRows = !inventory.showRows;
            
            [weakSelf.tableView reloadSections:[[NSIndexSet alloc]initWithIndex:section] withRowAnimation:UITableViewRowAnimationAutomatic];
        };
        
        return sectionView;
    }
    
    @end
    
    
    @implementation WMSBinLot
    
    - (instancetype)initWithBinLotInfo:(NSDictionary *)dict
    {
        if (self = [super init])
        {
            self.expirationDate = [WMSFmt safeString:dict[@"ExpirationDate"]];
            self.batchCode = [WMSFmt safeString:dict[@"BatchCode"]];
            self.inventory = [WMSFmt numberStringFormat:[WMSFmt safeString:dict[@"BinLotInventory"]]];
        }
        return self;
    }
    
    @end
    
    
    @implementation WMSBinInventory
    
    - (instancetype)initWithAttributes:(NSDictionary *)dict
    {
        if (self = [super init])
        {
            self.bin = [WMSFmt safeString:dict[@"Bin"]];
            self.binZone = [WMSFmt safeString:dict[@"BinZone"]];
            self.capacity = [WMSFmt numberStringFormat:[WMSFmt safeString:dict[@"Capacity"]]];
            self.pickPending = [WMSFmt numberStringFormat:[WMSFmt safeString:dict[@"PickPending"]]];
            self.displayInventory = [WMSFmt numberStringFormat:[WMSFmt safeString:dict[@"DisplayInventory"]]];
            self.inventory = dict[@"BinInventory"];
            
            [self.binLotArray removeAllObjects];
            
            for (NSDictionary *info in dict[@"BinLots"])
            {
                WMSBinLot *binLot = [[WMSBinLot alloc] initWithBinLotInfo:info];
                [self.binLotArray addObject:binLot];
            }
            self.hiddenDownBtn = (self.binLotArray.count > 0) ? NO : YES;
        }
        return self;
    }
    
    - (NSMutableArray<WMSBinLot *> *)binLotArray {
        if (!_binLotArray) {
            _binLotArray = [[NSMutableArray alloc] init];
        }
        return _binLotArray;
    }
    
    @end
    

    주요점
  • 사용자 정의 SectionHeaderView
  • SectionHeader 재사용
  • - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
        WMSBinInventoryTableSctionView *sectionView = [tableView dequeueReusableHeaderFooterViewWithIdentifier:kWMSBinInventoryTableSctionViewIdentifier];
        if (sectionView == nil) {
            sectionView = [[WMSBinInventoryTableSctionView alloc] initWithReuseIdentifier:kWMSBinInventoryTableSctionViewIdentifier];
        }
        // ...    
        return sectionView;
    }
    
    [self.tableView registerClass:[WMSBinInventoryTableSctionView class] forHeaderFooterViewReuseIdentifier:kWMSBinInventoryTableSctionViewIdentifier];
    
  • Secion
  • 업데이트
    [self.tableView reloadSections:[[NSIndexSet alloc]initWithIndex:section] withRowAnimation:UITableViewRowAnimationAutomatic];
    

    좋은 웹페이지 즐겨찾기