2323#import " UITableViewHeaderFooterView+BMDynamicLayout.h"
2424#import < objc/runtime.h>
2525#import " UITableView+BMPrivate.h"
26+ #import " UITableViewDynamicLayoutCacheHeight.h"
2627
2728@implementation UITableViewHeaderFooterView (BMDynamicLayout)
2829
@@ -36,38 +37,31 @@ - (void)setBm_maxYViewFixed:(BOOL)bm_maxYViewFixed {
3637
3738+ (instancetype )bm_tableViewHeaderFooterViewFromNibWithTableView : (UITableView *)tableView {
3839 NSString *selfClassName = NSStringFromClass (self.class );
39- NSString *reuseIdentifier = [selfClassName stringByAppendingString: @" BMDynamicLayoutReuseIdentifier " ];
40- UITableViewHeaderFooterView *headerFooterView = [ tableView dequeueReusableHeaderFooterViewWithIdentifier: reuseIdentifier];
41- if (headerFooterView) {
42- return headerFooterView ;
40+ NSString *reuseIdentifier = [selfClassName stringByAppendingString: @" BMNibDynamicLayoutReuseIdentifier " ];
41+ if ([ objc_getAssociatedObject ( tableView, (__bridge const void * _Nonnull)( object_getClass ( self ))) boolValue ]) {
42+ // 已注册
43+ return [tableView dequeueReusableHeaderFooterViewWithIdentifier: reuseIdentifier] ;
4344 }
44-
45- NSBundle *bundle = [NSBundle bundleForClass: self .class];
46- NSString *path = [bundle pathForResource: kSwiftClassNibName (selfClassName) ofType: @" nib" ];
47- if (path.length == 0 ) {
48- NSAssert (NO , @" 你的 UITableViewHeaderFooterView 不是 IB 创建的" );
49- return nil ;
50- }
51- NSArray <UITableViewHeaderFooterView *> *arr = [[UINib nibWithNibName: kSwiftClassNibName (selfClassName) bundle: bundle] instantiateWithOwner: nil options: nil ];
52- for (UITableViewHeaderFooterView *obj in arr) {
53- if ([obj isMemberOfClass: self .class]) {
54- headerFooterView = obj;
55- [headerFooterView setValue: reuseIdentifier forKey: @" reuseIdentifier" ];
56- return headerFooterView;
57- }
58- }
59- NSAssert (NO , @" 你的 UITableViewHeaderFooterView 不是 IB 创建的" );
60- return nil ;
45+ BM_UITableView_DynamicLayout_LOG (@" ✅✅✅✅%@ UINib nibWithNibName" , self);
46+ // 未注册,开始注册
47+ UINib *nib = [UINib nibWithNibName: kSwiftClassNibName (selfClassName) bundle: [NSBundle bundleForClass: self .class]];
48+ [tableView registerNib: nib forHeaderFooterViewReuseIdentifier: reuseIdentifier];
49+ objc_setAssociatedObject (tableView, (__bridge const void * _Nonnull)(object_getClass (self)), @YES , OBJC_ASSOCIATION_RETAIN_NONATOMIC );
50+ return [tableView dequeueReusableHeaderFooterViewWithIdentifier: reuseIdentifier];
6151}
6252
6353+ (instancetype )bm_tableViewHeaderFooterViewFromAllocWithTableView : (UITableView *)tableView {
6454 NSString *selfClassName = NSStringFromClass (self.class );
65- NSString *reuseIdentifier = [selfClassName stringByAppendingString: @" BMDynamicLayoutReuseIdentifier " ];
66- UITableViewHeaderFooterView *headerFooterView = [ tableView dequeueReusableHeaderFooterViewWithIdentifier: reuseIdentifier];
67- if (headerFooterView) {
68- return headerFooterView ;
55+ NSString *reuseIdentifier = [selfClassName stringByAppendingString: @" BMAllocDynamicLayoutReuseIdentifier " ];
56+ if ([ objc_getAssociatedObject ( tableView, (__bridge const void * _Nonnull)( self )) boolValue ]) {
57+ // 已注册
58+ return [tableView dequeueReusableHeaderFooterViewWithIdentifier: reuseIdentifier] ;
6959 }
70- return [[self alloc ] initWithReuseIdentifier: reuseIdentifier];
60+ BM_UITableView_DynamicLayout_LOG (@" ✅✅✅✅%@ registerClass" , self);
61+ // 未注册,开始注册
62+ [tableView registerClass: self forHeaderFooterViewReuseIdentifier: reuseIdentifier];
63+ objc_setAssociatedObject (tableView, (__bridge const void * _Nonnull)(self), @YES , OBJC_ASSOCIATION_RETAIN_NONATOMIC );
64+ return [tableView dequeueReusableHeaderFooterViewWithIdentifier: reuseIdentifier];
7165}
7266
7367@end
0 commit comments