ZYPinYinSearch.m 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. //
  2. // ZYPinYinSearch.m
  3. // ZYPinYinSearch
  4. //
  5. // Created by soufun on 15/7/27.
  6. // Copyright (c) 2015年 ZY. All rights reserved.
  7. //
  8. #import "ZYPinYinSearch.h"
  9. #import "ChineseInclude.h"
  10. #import "PinYinForObjc.h"
  11. #import "objc/runtime.h"
  12. #import <UIKit/UIKit.h>
  13. @implementation ZYPinYinSearch
  14. +(NSArray *)searchWithOriginalArray:(NSArray *)originalArray andSearchText:(NSString *)searchText andSearchByPropertyName:(NSString *)propertyName{
  15. NSMutableArray * dataSourceArray = [[NSMutableArray alloc]init];
  16. NSString * type;
  17. if(originalArray.count <= 0){
  18. UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"提示" message:@"数据源不能为空" delegate:nil cancelButtonTitle:@"确定" otherButtonTitles: nil];
  19. [alert show];
  20. return originalArray;
  21. }
  22. else{
  23. id object = originalArray[0];
  24. if ([object isKindOfClass:[NSString class]]) {
  25. type = @"string";
  26. }
  27. else if([object isKindOfClass:[NSDictionary class]]){
  28. type = @"dict";
  29. NSDictionary * dict = originalArray[0];
  30. // NSLog(@"字典keys:%@",[dict allKeys]);
  31. BOOL isExit = NO;
  32. for (NSString * key in dict.allKeys) {
  33. if([key isEqualToString:propertyName]){
  34. isExit = YES;
  35. break;
  36. }
  37. }
  38. if (!isExit) {
  39. UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"提示" message:[NSString stringWithFormat:@"数据源中的字典没有你指定的key:%@",propertyName] delegate:nil cancelButtonTitle:@"确定" otherButtonTitles: nil];
  40. [alert show];
  41. return originalArray;
  42. }
  43. }
  44. else{
  45. type = @"model";
  46. NSMutableArray *props = [NSMutableArray array];
  47. unsigned int outCount, i;
  48. objc_property_t *properties = class_copyPropertyList([object class], &outCount);
  49. for (i = 0; i<outCount; i++)
  50. {
  51. objc_property_t property = properties[i];
  52. const char* char_f = property_getName(property);
  53. NSString *propertyName = [NSString stringWithUTF8String:char_f];
  54. [props addObject:propertyName];
  55. }
  56. // NSLog(@"Model属性列表:%@",props);
  57. free(properties);
  58. BOOL isExit = NO;
  59. for (NSString * property in props) {
  60. if([property isEqualToString:propertyName]){
  61. isExit = YES;
  62. break;
  63. }
  64. }
  65. if (!isExit) {
  66. UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"提示" message:[NSString stringWithFormat:@"数据源中的Model没有你指定的属性:%@",propertyName] delegate:nil cancelButtonTitle:@"确定" otherButtonTitles: nil];
  67. [alert show];
  68. return originalArray;
  69. }
  70. }
  71. }
  72. if (searchText.length>0&&![ChineseInclude isIncludeChineseInString:searchText]) {
  73. for (int i=0; i<originalArray.count; i++) {
  74. NSString * tempString;
  75. if ([type isEqualToString:@"string"]) {
  76. tempString = originalArray[i];
  77. }
  78. else{
  79. tempString = [originalArray[i]valueForKey:propertyName];
  80. }
  81. if ([ChineseInclude isIncludeChineseInString:tempString]) {
  82. NSString *tempPinYinStr = [PinYinForObjc chineseConvertToPinYin:tempString];
  83. // NSLog(@"%@",tempPinYinStr);
  84. NSRange titleResult=[tempPinYinStr rangeOfString:searchText options:NSCaseInsensitiveSearch];
  85. if (titleResult.length>0) {
  86. [dataSourceArray addObject:originalArray[i]];
  87. continue;
  88. }
  89. NSString *tempPinYinHeadStr = [PinYinForObjc chineseConvertToPinYinHead:tempString];
  90. // NSLog(@"%@",tempPinYinHeadStr);
  91. NSRange titleHeadResult=[tempPinYinHeadStr rangeOfString:searchText options:NSCaseInsensitiveSearch];
  92. if (titleHeadResult.length>0) {
  93. [dataSourceArray addObject:originalArray[i]];
  94. continue;
  95. }
  96. }
  97. else {
  98. NSRange titleResult=[tempString rangeOfString:searchText options:NSCaseInsensitiveSearch];
  99. if (titleResult.length>0) {
  100. [dataSourceArray addObject:originalArray[i]];
  101. continue;
  102. }
  103. }
  104. }
  105. } else if (searchText.length>0&&[ChineseInclude isIncludeChineseInString:searchText]) {
  106. for (id object in originalArray) {
  107. NSString * tempString;
  108. if ([type isEqualToString:@"string"]) {
  109. tempString = object;
  110. }
  111. else{
  112. tempString = [object valueForKey:propertyName];
  113. }
  114. NSRange titleResult=[tempString rangeOfString:searchText options:NSCaseInsensitiveSearch];
  115. if (titleResult.length>0) {
  116. [dataSourceArray addObject:object];
  117. }
  118. }
  119. }
  120. return dataSourceArray;
  121. }
  122. @end