Skip to content

Commit dc10a72

Browse files
committed
refactored the testing example for more correct deletion of sections. Exposed sectionForHeaderView: and deprecated section variable of the headerview.
1 parent 0bd0ba8 commit dc10a72

File tree

5 files changed

+70
-53
lines changed

5 files changed

+70
-53
lines changed

Example/Testing_Example/FZAccordionTableViewExample/AccordionHeaderView.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@ static NSString *const kAccordionHeaderViewReuseIdentifier = @"AccordionHeaderVi
1313

1414
@interface AccordionHeaderView : FZAccordionTableViewHeaderView
1515

16-
@property (weak, nonatomic) IBOutlet UIButton *deleteButton;
16+
@property (copy, nonatomic) void (^pressedDeleteButtonBlock)(AccordionHeaderView *view);
1717

1818
@end

Example/Testing_Example/FZAccordionTableViewExample/AccordionHeaderView.m

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,23 @@
88

99
#import "AccordionHeaderView.h"
1010

11+
@interface AccordionHeaderView()
12+
13+
@property (weak, nonatomic) IBOutlet UIButton *deleteButton;
14+
15+
@end
16+
1117
@implementation AccordionHeaderView
1218

19+
- (void)awakeFromNib {
20+
[super awakeFromNib];
21+
[self.deleteButton addTarget:self action:@selector(pressedDeleteButton) forControlEvents:UIControlEventTouchUpInside];
22+
}
23+
24+
- (void)pressedDeleteButton {
25+
if (self.pressedDeleteButtonBlock) {
26+
self.pressedDeleteButtonBlock(self);
27+
}
28+
}
29+
1330
@end

Example/Testing_Example/FZAccordionTableViewExample/FirstViewController.m

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,6 @@ - (void)setupTableView {
4545
[self.tableView registerNib:[UINib nibWithNibName:@"AccordionHeaderView" bundle:nil] forHeaderFooterViewReuseIdentifier:kAccordionHeaderViewReuseIdentifier];
4646
}
4747

48-
#pragma mark - Action -
49-
50-
- (IBAction)pressedDeleteButton:(UIButton *)sender {
51-
// Don't use tag in real code
52-
[self.sections removeObjectAtIndex:sender.tag];
53-
[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sender.tag] withRowAnimation:UITableViewRowAnimationAutomatic];
54-
}
55-
5648
#pragma mark - Class Overrides -
5749

5850
- (BOOL)prefersStatusBarHidden {
@@ -94,8 +86,15 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N
9486

9587
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
9688
AccordionHeaderView *headerView = [tableView dequeueReusableHeaderFooterViewWithIdentifier:kAccordionHeaderViewReuseIdentifier];
97-
headerView.deleteButton.tag = section; // This is bad code, but works for testing!
98-
[headerView.deleteButton addTarget:self action:@selector(pressedDeleteButton:) forControlEvents:UIControlEventTouchUpInside];
89+
__weak typeof(self) weakSelf = self;
90+
headerView.pressedDeleteButtonBlock = ^(AccordionHeaderView *headerView) {
91+
typeof(self) strongSelf = weakSelf;
92+
if (strongSelf) {
93+
NSInteger section = [strongSelf.tableView sectionForHeaderView:headerView];
94+
[strongSelf.sections removeObjectAtIndex:section];
95+
[strongSelf.tableView deleteSections:[NSIndexSet indexSetWithIndex:section] withRowAnimation:UITableViewRowAnimationFade];
96+
}
97+
};
9998
return headerView;
10099
}
101100

FZAccordionTableView/FZAccordionTableView.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
/*!
3434
@desc The section which this header view is part of.
3535
*/
36-
@property (nonatomic, readonly) NSInteger section;
36+
@property (nonatomic, readonly) NSInteger section DEPRECATED_MSG_ATTRIBUTE("Use sectionForHeaderView: instead.");
3737

3838
@end
3939

@@ -104,6 +104,15 @@
104104
*/
105105
- (void)toggleSection:(NSInteger)section;
106106

107+
/*!
108+
@desc Finds the section of a header view.
109+
110+
@param headerView The header view whose section you want to find.
111+
112+
@returns The section of the header view.
113+
*/
114+
- (NSInteger)sectionForHeaderView:(UITableViewHeaderFooterView * _Nonnull)headerView;
115+
107116
@end
108117

109118
@protocol FZAccordionTableViewDelegate <NSObject>

FZAccordionTableView/FZAccordionTableView.m

Lines changed: 33 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,13 @@ @protocol FZAccordionTableViewHeaderViewDelegate;
3737

3838
@interface FZAccordionTableViewHeaderView()
3939

40-
@property (nonatomic) NSInteger section;
40+
//@property (nonatomic) NSInteger section;
4141
@property (nonatomic, weak) id <FZAccordionTableViewHeaderViewDelegate> delegate;
4242

4343
@end
4444

4545
@protocol FZAccordionTableViewHeaderViewDelegate <NSObject>
46-
- (void)headerView:(FZAccordionTableViewHeaderView *)sectionHeaderView didSelectHeaderInSection:(NSInteger)section;
46+
- (void)tappedHeaderView:(FZAccordionTableViewHeaderView *)sectionHeaderView;
4747
@end
4848

4949
@implementation FZAccordionTableViewHeaderView
@@ -67,10 +67,7 @@ - (void)singleInit {
6767
}
6868

6969
- (void)touchedHeaderView:(UITapGestureRecognizer *)recognizer {
70-
71-
72-
73-
[self.delegate headerView:self didSelectHeaderInSection:self.section];
70+
[self.delegate tappedHeaderView:self];
7471
}
7572

7673
@end
@@ -161,8 +158,34 @@ - (NSArray *)getIndexPathsForSection:(NSInteger)section {
161158
- (void)toggleSection:(NSInteger)section {
162159

163160
FZAccordionTableViewHeaderView *headerView = (FZAccordionTableViewHeaderView *)[self headerViewForSection:section];
161+
[self tappedHeaderView:headerView];
162+
}
163+
164+
- (NSInteger)sectionForHeaderView:(UITableViewHeaderFooterView *)headerView {
165+
166+
NSInteger section = NSNotFound;
167+
NSInteger minSection = 0;
168+
NSInteger maxSection = self.numberOfSections;
169+
170+
CGRect headerViewFrame = headerView.frame;
171+
CGRect compareHeaderViewFrame;
164172

165-
[self headerView:headerView didSelectHeaderInSection:section];
173+
while (minSection <= maxSection) {
174+
NSInteger middleSection = (minSection+maxSection)/2;
175+
compareHeaderViewFrame = [self rectForHeaderInSection:middleSection];
176+
if (CGRectEqualToRect(headerViewFrame, compareHeaderViewFrame)) {
177+
section = middleSection;
178+
break;
179+
}
180+
else if (headerViewFrame.origin.y > compareHeaderViewFrame.origin.y) {
181+
minSection = middleSection+1;
182+
}
183+
else {
184+
maxSection = middleSection-1;
185+
}
186+
}
187+
188+
return section;
166189
}
167190

168191
#pragma mark - UITableView Overrides -
@@ -245,40 +268,10 @@ - (void)setInitialOpenSections:(NSSet *)initialOpenedSections {
245268

246269
#pragma mark - FZAccordionTableViewHeaderViewDelegate -
247270

248-
249-
250-
- (NSInteger)sectionForHeaderView:(UITableViewHeaderFooterView *)headerView {
251-
252-
NSInteger section = NSNotFound;
253-
NSInteger min = 0;
254-
NSInteger max = self.numberOfSections;
255-
256-
CGRect headerViewFrame = headerView.frame;
257-
CGRect compareHeaderViewFrame;
258-
259-
while (min <= max) {
260-
NSInteger mid = (min+max)/2;
261-
compareHeaderViewFrame = [self rectForHeaderInSection:mid];
262-
if (CGRectEqualToRect(headerViewFrame, compareHeaderViewFrame)) {
263-
section = mid;
264-
break;
265-
}
266-
else if (headerViewFrame.origin.y > compareHeaderViewFrame.origin.y) {
267-
min = mid+1;
268-
}
269-
else {
270-
max = mid-1;
271-
}
272-
}
273-
274-
return section;
275-
}
276-
277-
278-
279-
- (void)headerView:(FZAccordionTableViewHeaderView *)sectionHeaderView didSelectHeaderInSection:(NSInteger)section {
271+
- (void)tappedHeaderView:(FZAccordionTableViewHeaderView *)sectionHeaderView {
272+
NSParameterAssert(sectionHeaderView);
280273

281-
section = [self sectionForHeaderView:sectionHeaderView];
274+
NSInteger section = [self sectionForHeaderView:sectionHeaderView];
282275

283276
// Do not interact with sections that are always opened
284277
if ([self isAlwaysOpenedSection:section]) {
@@ -445,7 +438,6 @@ - (UIView*)tableView:(UITableView*)tableView viewForHeaderInSection:(NSInteger)s
445438
if ([self.subclassDelegate respondsToSelector:@selector(tableView:viewForHeaderInSection:)]) {
446439
headerView = (FZAccordionTableViewHeaderView *)[self.subclassDelegate tableView:tableView viewForHeaderInSection:section];
447440
if ([headerView isKindOfClass:[FZAccordionTableViewHeaderView class]]) {
448-
headerView.section = section;
449441
headerView.delegate = self;
450442
}
451443
}

0 commit comments

Comments
 (0)