You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

183 lines
6.0 KiB

  1. //
  2. // PTTableContentViewController.m
  3. // PTDatabaseReader
  4. //
  5. // Created by Peng Tao on 15/11/23.
  6. // Copyright © 2015Peng Tao. All rights reserved.
  7. //
  8. #import "FLEXTableContentViewController.h"
  9. #import "FLEXMultiColumnTableView.h"
  10. #import "FLEXWebViewController.h"
  11. @interface FLEXTableContentViewController ()<FLEXMultiColumnTableViewDataSource, FLEXMultiColumnTableViewDelegate>
  12. @property (nonatomic, strong) FLEXMultiColumnTableView *multiColumView;
  13. @end
  14. @implementation FLEXTableContentViewController
  15. - (void)viewDidLoad {
  16. [super viewDidLoad];
  17. self.edgesForExtendedLayout = UIRectEdgeNone;
  18. [self.view addSubview:self.multiColumView];
  19. }
  20. - (void)viewWillAppear:(BOOL)animated
  21. {
  22. [super viewWillAppear:animated];
  23. [self.multiColumView reloadData];
  24. }
  25. #pragma mark -
  26. #pragma mark init SubView
  27. - (FLEXMultiColumnTableView *)multiColumView {
  28. if (!_multiColumView) {
  29. _multiColumView = [[FLEXMultiColumnTableView alloc] initWithFrame:
  30. CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
  31. _multiColumView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleTopMargin;
  32. _multiColumView.backgroundColor = [UIColor whiteColor];
  33. _multiColumView.dataSource = self;
  34. _multiColumView.delegate = self;
  35. }
  36. return _multiColumView;
  37. }
  38. #pragma mark MultiColumnTableView DataSource
  39. - (NSInteger)numberOfColumnsInTableView:(FLEXMultiColumnTableView *)tableView
  40. {
  41. return self.columnsArray.count;
  42. }
  43. - (NSInteger)numberOfRowsInTableView:(FLEXMultiColumnTableView *)tableView
  44. {
  45. return self.contentsArray.count;
  46. }
  47. - (NSString *)columnNameInColumn:(NSInteger)column
  48. {
  49. return self.columnsArray[column];
  50. }
  51. - (NSString *)rowNameInRow:(NSInteger)row
  52. {
  53. return [NSString stringWithFormat:@"%ld",(long)row];
  54. }
  55. - (NSString *)contentAtColumn:(NSInteger)column row:(NSInteger)row
  56. {
  57. if (self.contentsArray.count > row) {
  58. NSDictionary<NSString *, id> *dic = self.contentsArray[row];
  59. if (self.contentsArray.count > column) {
  60. return [NSString stringWithFormat:@"%@",[dic objectForKey:self.columnsArray[column]]];
  61. }
  62. }
  63. return @"";
  64. }
  65. - (NSArray *)contentAtRow:(NSInteger)row
  66. {
  67. NSMutableArray *result = [NSMutableArray array];
  68. if (self.contentsArray.count > row) {
  69. NSDictionary<NSString *, id> *dic = self.contentsArray[row];
  70. for (int i = 0; i < self.columnsArray.count; i ++) {
  71. [result addObject:dic[self.columnsArray[i]]];
  72. }
  73. return result;
  74. }
  75. return nil;
  76. }
  77. - (CGFloat)multiColumnTableView:(FLEXMultiColumnTableView *)tableView
  78. heightForContentCellInRow:(NSInteger)row
  79. {
  80. return 40;
  81. }
  82. - (CGFloat)multiColumnTableView:(FLEXMultiColumnTableView *)tableView
  83. widthForContentCellInColumn:(NSInteger)column
  84. {
  85. return 120;
  86. }
  87. - (CGFloat)heightForTopHeaderInTableView:(FLEXMultiColumnTableView *)tableView
  88. {
  89. return 40;
  90. }
  91. - (CGFloat)widthForLeftHeaderInTableView:(FLEXMultiColumnTableView *)tableView
  92. {
  93. NSString *str = [NSString stringWithFormat:@"%lu",(unsigned long)self.contentsArray.count];
  94. NSDictionary<NSString *, id> *attrs = @{@"NSFontAttributeName":[UIFont systemFontOfSize:17.0]};
  95. CGSize size = [str boundingRectWithSize:CGSizeMake(CGFLOAT_MAX, 14)
  96. options:NSStringDrawingUsesLineFragmentOrigin
  97. attributes:attrs context:nil].size;
  98. return size.width + 20;
  99. }
  100. #pragma mark -
  101. #pragma mark MultiColumnTableView Delegate
  102. - (void)multiColumnTableView:(FLEXMultiColumnTableView *)tableView didTapLabelWithText:(NSString *)text
  103. {
  104. FLEXWebViewController * detailViewController = [[FLEXWebViewController alloc] initWithText:text];
  105. [self.navigationController pushViewController:detailViewController animated:YES];
  106. }
  107. - (void)multiColumnTableView:(FLEXMultiColumnTableView *)tableView didTapHeaderWithText:(NSString *)text sortType:(FLEXTableColumnHeaderSortType)sortType
  108. {
  109. NSArray<NSDictionary<NSString *, id> *> *sortContentData = [self.contentsArray sortedArrayUsingComparator:^NSComparisonResult(NSDictionary<NSString *, id> * obj1, NSDictionary<NSString *, id> * obj2) {
  110. if ([obj1 objectForKey:text] == [NSNull null]) {
  111. return NSOrderedAscending;
  112. }
  113. if ([obj2 objectForKey:text] == [NSNull null]) {
  114. return NSOrderedDescending;
  115. }
  116. if (![[obj1 objectForKey:text] respondsToSelector:@selector(compare:)] && ![[obj2 objectForKey:text] respondsToSelector:@selector(compare:)]) {
  117. return NSOrderedSame;
  118. }
  119. NSComparisonResult result = [[obj1 objectForKey:text] compare:[obj2 objectForKey:text]];
  120. return result;
  121. }];
  122. if (sortType == FLEXTableColumnHeaderSortTypeDesc) {
  123. NSEnumerator *contentReverseEvumerator = [sortContentData reverseObjectEnumerator];
  124. sortContentData = [NSArray arrayWithArray:[contentReverseEvumerator allObjects]];
  125. }
  126. self.contentsArray = sortContentData;
  127. [self.multiColumView reloadData];
  128. }
  129. #pragma mark -
  130. #pragma mark About Transition
  131. - (void)willTransitionToTraitCollection:(UITraitCollection *)newCollection
  132. withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinator
  133. {
  134. [super willTransitionToTraitCollection:newCollection
  135. withTransitionCoordinator:coordinator];
  136. [coordinator animateAlongsideTransition:^(id <UIViewControllerTransitionCoordinatorContext> context) {
  137. if (newCollection.verticalSizeClass == UIUserInterfaceSizeClassCompact) {
  138. self->_multiColumView.frame = CGRectMake(0, 32, self.view.frame.size.width, self.view.frame.size.height - 32);
  139. }
  140. else {
  141. self->_multiColumView.frame = CGRectMake(0, 64, self.view.frame.size.width, self.view.frame.size.height - 64);
  142. }
  143. [self.view setNeedsLayout];
  144. } completion:nil];
  145. }
  146. @end