From 482f940a664a3d555765f22bfbf2bc0b271fc3e0 Mon Sep 17 00:00:00 2001 From: Wicky Date: Wed, 17 Jun 2020 18:50:31 +0800 Subject: [PATCH] =?UTF-8?q?1.1.7.8=20=E5=85=BC=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DWTableViewHelper/DWTableViewHelper.h | 8 ++++++ DWTableViewHelper/DWTableViewHelper.m | 38 ++++++++++++++++++++------- 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/DWTableViewHelper/DWTableViewHelper.h b/DWTableViewHelper/DWTableViewHelper.h index fcaa130..9d31722 100755 --- a/DWTableViewHelper/DWTableViewHelper.h +++ b/DWTableViewHelper/DWTableViewHelper.h @@ -123,6 +123,11 @@ version 1.1.7.7.1 修改helper行高返回合法值及优先级 + + version 1.1.7.8 + 增加兼容模式,modelFromIndexPath兼容更多异常情况 + 行高计算修改部分问题 + createCell增加兼容模式 */ #import @@ -486,6 +491,9 @@ typedef NS_ENUM(NSUInteger, DWTableViewHelperLoadDataMode) {///数据加载优 ///配合DWTableViewHelperLoadDataIgnoreHighSpeedMode使用,标志cell是否被绘制过 @property (nonatomic ,assign ,readonly) BOOL cellHasBeenDrawn; +///仅为了避免异常崩溃而生成的占位model +@property (nonatomic ,assign ,readonly) BOOL placeHolderAvoidCrashing; + /** 当前正在展示的cell diff --git a/DWTableViewHelper/DWTableViewHelper.m b/DWTableViewHelper/DWTableViewHelper.m index eeae5bf..74a68d0 100644 --- a/DWTableViewHelper/DWTableViewHelper.m +++ b/DWTableViewHelper/DWTableViewHelper.m @@ -16,6 +16,15 @@ static UIImage * ImageNull = nil; const CGFloat DWTableViewHelperAutomaticDimensionAndCache = -91.0702; + +@interface DWTableviewHelperPlaceHolderCell : DWTableViewHelperCell + +@end + +@implementation DWTableviewHelperPlaceHolderCell + +@end + @interface DWTableViewHelper () { BOOL hasPlaceHolderView; @@ -59,6 +68,8 @@ @interface DWTableViewHelperModel () @property (nonatomic ,strong) NSIndexPath * currentDisplayIndexPath; +@property (nonatomic ,assign) BOOL placeHolderAvoidCrashing; + @end @implementation DWTableViewHelper @@ -90,7 +101,7 @@ -(__kindof DWTableViewHelperModel *)modelFromIndexPath:(NSIndexPath *)indexPath if (self.multiSection) { if (indexPath.section >= self.dataSource.count) { NSAssert(NO, @"can't fetch model at indexPath(%ld-%ld) for currentDataSource count is %ld",indexPath.section,indexPath.row,self.dataSource.count); - return nil; + return PlaceHolderCellModelAvoidCrashingGetter(); } obj = self.dataSource[indexPath.section]; if (![obj isKindOfClass:[NSArray class]]) { @@ -98,11 +109,11 @@ -(__kindof DWTableViewHelperModel *)modelFromIndexPath:(NSIndexPath *)indexPath if ([obj isKindOfClass:[DWTableViewHelperModel class]]) { return obj; } - return nil; + return PlaceHolderCellModelAvoidCrashingGetter(); } if (indexPath.row >= [obj count]) { NSAssert(NO, @"can't fetch model at indexPath(%ld-%ld) for currentDataSource subArr count is %ld",indexPath.section,indexPath.row,[obj count]); - return nil; + return PlaceHolderCellModelAvoidCrashingGetter(); } obj = self.dataSource[indexPath.section][indexPath.row]; if (![obj isKindOfClass:[DWTableViewHelperModel class]]) { @@ -112,7 +123,7 @@ -(__kindof DWTableViewHelperModel *)modelFromIndexPath:(NSIndexPath *)indexPath } else { if (indexPath.row >= self.dataSource.count) { NSAssert(NO, @"can't fetch model at indexPath(%ld-%ld) for currentDataSource count is %ld",indexPath.section,indexPath.row,self.dataSource.count); - return nil; + return PlaceHolderCellModelAvoidCrashingGetter(); } obj = self.dataSource[indexPath.row]; if (![obj isKindOfClass:[DWTableViewHelperModel class]]) { @@ -1120,6 +1131,11 @@ -(CGFloat)autoCalculateRowHeightWithModel:(__kindof DWTableViewHelperModel *)mod ///根据cell计算cell的高度(代码源自FDTemplateLayoutCell) -(CGFloat)calculateCellHeightWithCell:(UITableViewCell *)cell { + + if (!cell || [cell isKindOfClass:[DWTableviewHelperPlaceHolderCell class]]) { + return 0.01; + } + CGFloat width = self.tabV.bounds.size.width; if (width <= 0) { @@ -1129,7 +1145,7 @@ -(CGFloat)calculateCellHeightWithCell:(UITableViewCell *)cell { CGRect cellBounds = cell.bounds; cellBounds.size.width = width; cell.bounds = cellBounds; - CGFloat accessoryViewWidth; + CGFloat accessoryViewWidth = 0; for (UIView *view in self.tabV.subviews) { if ([view isKindOfClass:NSClassFromString(@"UITableViewIndex")]) { @@ -1140,7 +1156,7 @@ -(CGFloat)calculateCellHeightWithCell:(UITableViewCell *)cell { //根据辅助视图校正width if (cell.accessoryView) { - accessoryViewWidth = (cell.accessoryView.bounds.size.width + 16); + accessoryViewWidth += (cell.accessoryView.bounds.size.width + 16); } else { static const CGFloat accessoryWidth[] = { [UITableViewCellAccessoryNone] = 0, @@ -1149,7 +1165,7 @@ -(CGFloat)calculateCellHeightWithCell:(UITableViewCell *)cell { [UITableViewCellAccessoryCheckmark] = 40, [UITableViewCellAccessoryDetailButton] = 48 }; - accessoryViewWidth = accessoryWidth[cell.accessoryType]; + accessoryViewWidth += accessoryWidth[cell.accessoryType]; } if ([UIScreen mainScreen].scale >= 3 && [UIScreen mainScreen].bounds.size.width >= 414) { @@ -1216,7 +1232,8 @@ -(__kindof DWTableViewHelperCell *)createCellFromModel:(DWTableViewHelperModel * aCellClassStr = self.cellClassStr; } else { NSAssert(NO, @"cellClassStr and cellID must be set together at least one time in DWTableViewHelperModel or DWTableViewHelper"); - return nil; + cellIDTemp = PlaceHolderCellModelAvoidCrashingGetter().cellID; + aCellClassStr = PlaceHolderCellModelAvoidCrashingGetter().cellClassStr; } __kindof DWTableViewHelperCell * cell = nil; if (useReuse) { @@ -1234,7 +1251,7 @@ -(__kindof DWTableViewHelperCell *)createCellFromModel:(DWTableViewHelperModel * Class cellClass = NSClassFromString(aCellClassStr); if (!cellClass) { NSAssert(NO, @"cannot load a cellClass from %@,check the cellClassStr you have set",aCellClassStr); - return nil; + cellClass = NSClassFromString(PlaceHolderCellModelAvoidCrashingGetter().cellClassStr); } if (model.loadCellFromNib) { @@ -1616,8 +1633,9 @@ static inline void handlePlaceHolderView(UIView * placeHolderView,UITableView * if (PlaceHolderCellModelAvoidCrashing == nil) { PlaceHolderCellModelAvoidCrashing = [DWTableViewHelperModel new]; PlaceHolderCellModelAvoidCrashing.cellRowHeight = 0; - PlaceHolderCellModelAvoidCrashing.cellClassStr = NSStringFromClass([DWTableViewHelperCell class]); + PlaceHolderCellModelAvoidCrashing.cellClassStr = NSStringFromClass([DWTableviewHelperPlaceHolderCell class]); PlaceHolderCellModelAvoidCrashing.cellID = @"PlaceHolderCellAvoidCrashing"; + PlaceHolderCellModelAvoidCrashing.placeHolderAvoidCrashing = YES; } return PlaceHolderCellModelAvoidCrashing; }