이것은 약간 다른 질문에 대한 답입니다. 언제 UITableView
에게 전화 를 걸 었는지 알아야했습니다 cellForRowAtIndexPath()
. 나는 layoutSubviews()
(@Eric MORAND에게 감사드립니다) 서브 클래 싱 하고 델리게이트 콜백을 추가했습니다.
SDTableView.h :
@protocol SDTableViewDelegate <NSObject, UITableViewDelegate>
@required
- (void)willReloadData;
- (void)didReloadData;
- (void)willLayoutSubviews;
- (void)didLayoutSubviews;
@end
@interface SDTableView : UITableView
@property(nonatomic,assign) id <SDTableViewDelegate> delegate;
@end;
SDTableView.m :
#import "SDTableView.h"
@implementation SDTableView
@dynamic delegate;
- (void) reloadData {
[self.delegate willReloadData];
[super reloadData];
[self.delegate didReloadData];
}
- (void) layoutSubviews {
[self.delegate willLayoutSubviews];
[super layoutSubviews];
[self.delegate didLayoutSubviews];
}
@end
용법:
MyTableViewController.h :
#import "SDTableView.h"
@interface MyTableViewController : UITableViewController <SDTableViewDelegate>
@property (nonatomic) BOOL reloadInProgress;
MyTableViewController.m :
#import "MyTableViewController.h"
@implementation MyTableViewController
@synthesize reloadInProgress;
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
if ( ! reloadInProgress) {
NSLog(@"---- numberOfSectionsInTableView(): reloadInProgress=TRUE");
reloadInProgress = TRUE;
}
return 1;
}
- (void)willReloadData {}
- (void)didReloadData {}
- (void)willLayoutSubviews {}
- (void)didLayoutSubviews {
if (reloadInProgress) {
NSLog(@"---- layoutSubviewsEnd(): reloadInProgress=FALSE");
reloadInProgress = FALSE;
}
}
참고 :UITableView
이것은 이미 위임 속성을 가리키는
하위 클래스이므로 MyTableViewController
다른 속성 을 추가 할 필요가 없습니다. "@dynamic delegate"는 컴파일러에게이 속성을 사용하도록 지시합니다. (다음은 이것을 설명하는 링크입니다 : http://farhadnoorzay.com/2012/01/20/objective-c-how-to-add-delegate-methods-in-a-subclass/ )
새 클래스 를 사용하려면 의 UITableView
속성을 MyTableViewController
변경해야합니다 SDTableView
. 이것은 Interface Builder Identity Inspector에서 수행됩니다. UITableView
내부를 선택 UITableViewController
하고 "Custom Class"를로 설정합니다 SDTableView
.