SelectButton.m 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. //
  2. // SelectButton.m
  3. // JasonDevelop
  4. //
  5. // Created by Jason Lee on 2013. 12. 16..
  6. // Copyright (c) jasondevelop. All rights reserved.
  7. //
  8. #import "CommonUtil.h"
  9. #import "SelectButton.h"
  10. #import "UIViewController-ActionSheetSimulation.h"
  11. #define kfToolBarHeight 44.0f
  12. #define kUIBtnTintColor [UIColor whiteColor]
  13. @interface SelectButton () <UIPickerViewDataSource, UIPickerViewDelegate> {
  14. @protected
  15. UIView *_simulatedActionSheetView;
  16. UIPickerView *_pickerView;
  17. UIToolbar *_actionToolbar;
  18. NSInteger _selectedRow;
  19. }
  20. @end
  21. @implementation SelectButton
  22. - (void)awakeFromNib {
  23. [super awakeFromNib];
  24. [self addTarget:self action:@selector(didTouchButton) forControlEvents:UIControlEventTouchUpInside];
  25. }
  26. - (id)selectedTitle {
  27. if (![[_dataDict allKeys] containsObject:[self titleForState:UIControlStateNormal]]) return nil;
  28. NSInteger row = [_pickerView selectedRowInComponent:0];
  29. return [_dataDict keyAtIndex:(NSInteger)row];
  30. }
  31. - (void)setSelectedTitle:(id)selectedTitle {
  32. NSString *selectedKey = nil;
  33. NSInteger row = 0;
  34. for (NSString *lKey in _dataDict.allKeys) {
  35. if ([selectedTitle isEqualToString:lKey]) {
  36. break;
  37. }
  38. row++;
  39. }
  40. if (row < _dataDict.allKeys.count) {
  41. [_pickerView selectRow:row inComponent:0 animated:YES];
  42. selectedKey = [_dataDict keyAtIndex:(NSInteger)row];
  43. [self setTitle:selectedKey forState:UIControlStateNormal];
  44. }
  45. }
  46. - (id)selectedValue {
  47. //플레이스 홀더일 경우, nil 리턴
  48. if (![_dataDict objectForKey:[self titleForState:UIControlStateNormal]]) return nil;
  49. NSInteger row = [_pickerView selectedRowInComponent:0];
  50. return [_dataDict objectAtIndex:(NSInteger)row];
  51. }
  52. - (void)setSelectedValue:(id)selectedValue {
  53. BOOL isValueStringType = [selectedValue isKindOfClass:[NSString class]]; //스트링이 아니면, NSNumber
  54. NSString *selectedKey = nil;
  55. NSInteger row = 0;
  56. for (NSObject *object in _dataDict.allValues) {
  57. if (isValueStringType) {
  58. NSString *value = (NSString *)object;
  59. if ([value isEqualToString:selectedValue]) {
  60. break;
  61. }
  62. } else {
  63. NSNumber *value = (NSNumber *)object;
  64. if ([value isEqualToNumber:selectedValue]) {
  65. break;
  66. }
  67. }
  68. row++;
  69. }
  70. if (row < _dataDict.allKeys.count) {
  71. [_pickerView selectRow:row inComponent:0 animated:YES];
  72. selectedKey = [_dataDict keyAtIndex:(NSInteger)row];
  73. [self setTitle:selectedKey forState:UIControlStateNormal];
  74. }
  75. }
  76. - (void)reloadDataDict {
  77. [_pickerView reloadAllComponents];
  78. }
  79. #pragma mark - UIActionSheet Delegate
  80. - (void)didTouchButton {
  81. [self showPicker];
  82. }
  83. - (void)generateActionSheet {
  84. if (_pickerView)
  85. return;
  86. //피커뷰를 만듬.
  87. _pickerView = [[UIPickerView alloc] init];
  88. _pickerView.dataSource = self;
  89. _pickerView.delegate = self;
  90. _pickerView.showsSelectionIndicator = YES;
  91. UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithTitle:@"취소" style:UIBarButtonItemStylePlain target:self action:@selector(pickerCancelPressed:)];
  92. UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:self action:nil];
  93. UIBarButtonItem *fixedSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:self action:nil];
  94. fixedSpace.width = 10;
  95. UIBarButtonItem *doneBtn = [[UIBarButtonItem alloc] initWithTitle:@"선택" style:UIBarButtonItemStylePlain target:self action:@selector(pickerDonePressed:)];
  96. if (IOS_VERSION >= 7.0f) {
  97. cancelButton.tintColor = kUIBtnTintColor;
  98. doneBtn.tintColor = kUIBtnTintColor;
  99. }
  100. CGFloat width = [UIScreen mainScreen].bounds.size.width;
  101. _actionToolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, width, kfToolBarHeight)];
  102. _actionToolbar.barStyle = UIBarStyleBlack;
  103. [_actionToolbar setItems:[NSArray arrayWithObjects:fixedSpace, cancelButton, flexSpace, doneBtn, fixedSpace, nil] animated:YES];
  104. _simulatedActionSheetView = [[CommonUtil currentViewController] actionSheetSimulationWithPickerView:_pickerView withToolbar:_actionToolbar];
  105. }
  106. - (void)showPicker {
  107. [[CommonUtil currentViewController].view endEditing:YES];
  108. if (!_simulatedActionSheetView) {
  109. [self generateActionSheet];
  110. }
  111. [[CommonUtil currentViewController] showActionSheetSimulation:_simulatedActionSheetView pickerView:_pickerView withToolbar:_actionToolbar];
  112. }
  113. - (void)pickerDonePressed:(id)sender {
  114. [[CommonUtil currentViewController] dismissActionSheetSimulation:_simulatedActionSheetView];
  115. if (!_dataDict || _dataDict.count <= 0)
  116. return;
  117. NSInteger row = [_pickerView selectedRowInComponent:0];
  118. NSString *key = [_dataDict keyAtIndex:(NSInteger)row];
  119. [self setTitle:key forState:UIControlStateNormal];
  120. [self setTitleColor:_textColorNormal forState:UIControlStateNormal];
  121. if ([_delegate respondsToSelector:@selector(didChangedSelectRow:selectedIndex:)]) {
  122. [_delegate didChangedSelectRow:self selectedIndex:row];
  123. }
  124. if ([_delegate respondsToSelector:@selector(didChangedSelect:info:)]) {
  125. NSDictionary *info = @{@"key": key,
  126. @"value": [self.dataDict objectForKey:key]};
  127. [_delegate didChangedSelect:self info:info];
  128. }
  129. }
  130. - (void)pickerCancelPressed:(id)sender {
  131. [[CommonUtil currentViewController] dismissActionSheetSimulation:_simulatedActionSheetView];
  132. }
  133. #pragma mark - UIPickerViewDelegate
  134. - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
  135. return 1;
  136. }
  137. - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
  138. return _dataDict.count;
  139. }
  140. - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
  141. NSString *string = [_dataDict keyAtIndex:(NSInteger)row];
  142. return string;
  143. }
  144. - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
  145. // NSString *string = [_dataDict keyAtIndex:(NSInteger)row];
  146. // [self setTitle:string forState:UIControlStateNormal];
  147. // [self setTitleColor:_textColorNormal forState:UIControlStateNormal];
  148. }
  149. - (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {
  150. UILabel *text = (UILabel*)view;
  151. if (!text){
  152. text = [[UILabel alloc] init];
  153. //Set label style
  154. text.font = [UIFont systemFontOfSize:16.0f];
  155. text.textColor = [UIColor whiteColor];
  156. text.textAlignment = NSTextAlignmentCenter;
  157. }
  158. //Set text value
  159. text.text = [_dataDict keyAtIndex:row];
  160. return text;
  161. }
  162. @end
  163. @interface SelectListButton () {
  164. }
  165. @end
  166. @implementation SelectListButton
  167. - (void)awakeFromNib {
  168. //부모클래스의 함수를 호출하지 않음.
  169. [self addTarget:self action:@selector(didTouchButton) forControlEvents:UIControlEventTouchUpInside];
  170. }
  171. @end