2013-06-19 6 views
-1

테이블보기가있어서 제목을 검색 할 수 있습니다. 셀에 자막을 추가하고 싶습니다. 자막의 정보를 제목으로 검색 할 수 있기를 바랍니다. 자막 배열의 각 항목의 인덱스는 제목 배열의 같은 인덱스에있는 객체에 해당합니다. 그래서, 내가 가진 한 가지 문제는, 내가 검색하고 검색 텍스트에 따라 테이블보기 자동 업데이트, 내가 그걸로 올바른 자막 쇼를해야합니다. 자막에있는 텍스트를 검색 할 때도 동일한 작업을 수행해야합니다. 자막의 올바른 제목을 표시해야합니다. 어떤 제안?셀의 자막이있는 테이블보기 검색

#import "List.h" 
#import "RSFM.h" 
#import "DTCustomColoredAccessory.h" 

@interface List() 

@end 

@implementation List 
{ 
    NSMutableArray *title; 
    NSMutableArray *subtitle; 
    NSMutableArray *displayItems; 
} 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 

    title = [[NSMutableArray alloc]initWithObjects:@"Cates Farm", @"Broadbent B & B Foods", @"Cayce's Pumpkin Patch", @"Metcalfe Landscaping", @"Brumfield Farm Market", @"Dogwood Valley Farm", @"Country Fresh Meats & Farmers Market", @"Jim David Meats", @"Trunnell's Farm Market", @"Lovell's Orchard & Farm Market", @"Zook's Produce", @"The Country Barn", @"Poore's Nursery & Farms", @"Just Piddlin Farm", @"Chaney's Dairy Barn & Restaurant", @"Jackson's Orchard & Nursery, Inc.", @"Mammoth Cave Transplants", @"Habegger's Amish Market", @"Kenny's Farmhouse Cheese", @"Dennison's Roadside Market", @"Roberts Family Farm", @"Wooden Farm", @"Lee's Garden Center, Florist & Gift Shop", @"Hinton's Orchard & Farm Market", @"Serenity Farm Alpacas", @"Burton's Nursery & Garden Center", @"Davis Family Farms", @"Heavenly Haven Farm", @"French Valley Farms", @"Cravens Greenhouse", @"Haney's Appledale Farm", @"Hettmansperger's Greenhouse", @"D & F Farms", @"Double Hart Farm", @"Owens Garden Center", @"Hail's Farm", @"Sinking Valley Vineyard & Winery, Inc.", @"Todd's Greenhouse & Florist, LLC", @"McQuerry's Family Farm-Herbs-N-Heirlooms", @"Berea College Farm & Gardens", @"Acres of Land Winery & Restaurant", @"Baldwin Farms", @"Wonder of Life Farm", @"Chateau du Vieux Corbeau Winery/Old Crow Farm Winery", @"Devine's Farm & Corn Maze", @"Williams Country Market", @"Serano Alpacas & Yarns", @"St. Catharine Farm", @"Capture Your Heart Alpacas", @"Ridgeview Greenhouse & Nursery", @"Country Corner Greenhouse & Nursery, Inc", @"Sunny Acres Farm", @"Morrison's Greenhouses", @"George Gagel Farm Market, LLC", @"Thieneman's Herbs & Perennials", @"Tower View Farm & Nursery", @"Gallrein Farms", @"Sweet Home Spun in the Low Dutch Meetinghouse", @"Mulberry Orchard, LLC", @"Gregory Farms", @"Sherwood Acres Beef", @"Bray Orchard & Roadside Market", @"Callis Orchards", @"Bray Fruit", @"Wilson's Nursery", @"Triple J Farm", @"Ayres Family Orchard", @"Michels Family Farm", @"Amerson Farm", @"Bi-Water Farm & Greenhouse", @"Alpine Hills Dairy Tour/Country Pumpkins", @"Blue Ribbon Market", @"Eagle Bend Alpacas Fiber & Gift Shoppe", @"Redman's Farm",@"The Greenhouse in Gertrude", @"Croppers Greenhouse & Nursery", @"McLean's Aerofresh Fruit", @"Julie's Pumpkins", @"Reed Valley Orchard", @"Evans Orchard & Cider Mill", @"Antioch Daylily Garden", @"Golden Apple Fruit Market", @"Boyd Orchards", @"Serenity Hill Fiber & Living History Farm", @"Beech Springs Farm Market", @"Yuletide Tree Farm & Nursery", @"Townsend's Sorghum Mill and Farm Market", @"Bramble Ridge Orchard", @"Country Garden Greenhouse", @"Golden Apple Fruit Market", @"Black Barn Produce, LLC", @"Imel's Greenhouse", @"Feathered Wing Farm Market", @"Hutton-Loyd Tree Farm", @"Halcomb's Knob, LLC", @"Happy Hollow Farms", @"Reid's Orchard", @"McKinney Farm", @"Crawford Farms", @"Brian T. Guffey Livestock & Produce", @"MeadowBrook Orchards & Farm", @"Rising Sons Home Farm Winery", @"VanMeter Family Farm", nil]; 

    subtitle = [[NSMutableArray alloc]initWithObjects:@"Hwy 425 Henderson, KY 42420", @"257 Mary Blue Road Kuttawa, KY 42055", @"153 Farmersville Road Princeton, KY 42445", @"410 Princeton Road Madisonville, KY 42431", @"3320 Nebo Road Madisonville, KY 42431", @"4551 State Route 109N Clay, KY 42404", @"9355 US Hwy 60 W Sturgis, KY 42459",@"350 T. Frank Wathen Rd. Uniontown, KY 42461", @"9255 Hwy 431 Utica, KY 42376", @"22850 Coal Creek Road Hopkinsville, KY 42240", @"Intersection of KY107 & KY117 Herndon, KY 42240", @"112 Britmart Road Elkton, KY 42220", @"5486 Morgantown Road Russellville, KY 42276", @"10830 S. Morgantown Rd. Woodburn, KY 42170", @"9191 Nashville Road, Bowling Green, KY 42101", @"1280 Slim Island Road Bowling Green, KY 42101", @"5394 Brownsville Road Brownsville, KY 42210", @"945 Perrytown Road Scottsville, KY 42164", @"2033 Thomerson Park Road Austin, KY 42123", @"5824 S. Jackson Hwy. Horse Cave, KY 42749", @"125 Kennedy Road Guston, KY 40142", @"1869 Wooden Lane Elizabethtown, KY 42701", @"1918 Bardstown Road Hodgenville, KY 42748", @"8631 Campbellsville Road Hodgenville, KY 42748", @"1380 Frogg Lane Raywick, KY 40060", @"2212 Saloma Road Campbellsville, KY 42718", @"313 Hwy 1464 Greensburg, KY 42743", @"230 Heavenly Lane Columbia, KY 42728", @"1842 N. Main St. Jamestown, KY 42629", @"500 Cedar Hill Road Albany, KY 42602", @"8350 West 80 Nancy, KY 42544-8756", @"3917 N. Hwy 837 Science Hill, KY 42553", @"755 Elihu Rush Branch Road Somerset, KY 42501", @"6550 Cumberland Falls Road Corbin, KY 40701", @"735 Latham Road Somerset, KY 42503", @"Hwy 461, at 3 mile marker Somerset, KY 42503", @"1300 Plato-Vanhook Road Somerset, KY 42503", @"35 Skyline Drive Eubank, KY 42567", @"169 Pine Hill Road Paint Lick, KY 40461", @"230 N. Main St. Berea, KY 40404", @"2285 Barnes Mill Road Richmond, KY 40475", @"1113 Tates Creek Road Richmond, KY 40475", @"686 Buckeye Road Lancaster, KY 40444", @"471 Stanford Avenue Danville, KY 40422-1927", @"623 Talmage-Mayo Road Harrodsburg, KY 40330", @"4189 Craintown Rd. Gravel Switch, KY 40328", @"1805 Booker Road Springfield, KY 40069", @"2645 Bardstown Road Springfield, KY 40061", @"9430 Bloomfield Road Bloomfield, KY 40008", @"460 Buffalo Run Road Shepherdsville, KY 40165", @"4877 Hwy 44E Shepherdsville, KY 40165", @"6516 Echo Trail Jeffersontown, KY 40299", @"5613 Cooper Chapel Road Louisville, KY 40229", @"2400 Lower Hunters Trace Louisville, KY 40216", @"9120 Blowing Tree Road Louisville, KY 40220", @"12523 Taylorsville Road Jeffersontown, KY 40299", @"1029 Vigo Road Shelbyville, KY 40065", @"6805 Castle Hwy. Pleasureville, KY 40057", @"1330 Mulberry Pike Shelbyville, KY 40065", @"985 Vance Road Turners Station, KY 40075", @"215 Parker Drive LaGrange, KY 40031", @"2580 Hwy 42 W. Bedford, KY 40006", @"3721 Hwy 421 N Bedford, KY 40006", @"1660 Highway 421 N Bedford, KY 40006", @"3690 East-West Connector (Rte 676) Frankfort, KY 40601", @"2287 Long Lick Road Georgetown, KY 40324", @"525 Wilson Lane Owenton, KY 40359", @"4275 Hwy 1316 Sparta, KY 41086", @"130 McClelland Circle Georgetown, KY 40324", @"877 Cincinnati Road Georgetown, KY 40324", @"2165 Sherman Mount Zion Rd. Dry Ridge, KY 41035", @"8707 Camp Ernst Road Union, KY 41091", @"7812 East Bend Road Burlington, KY 41005", @"12449 Decoursey Pike Morning View, KY 41063", @"3246 Augusta-Berlin Road Brooksville, KY 41004", @"5350 Raymond Road May's Lick, KY 41055", @"4085 Ewing Road Ewing, KY 41039", @"1069 Ruddles Mill Road Paris, KY 40361", @"239 Lail Lane Paris, KY 40361", @"180 Stone Road Georgetown, KY 40324", @"2231 Houston Antioch Road Lexington, KY 40516", @"1801 Alexandria Drive Lexington, KY 40504", @"1396 Pinckard Pike Versailles, KY 40383", @"1371 Beverly Lane Nicholasville, KY 40356", @"4776 Old Boonesboro Road Winchester, KY 40391", @"3925 Old Boonesboro Road Winchester, KY 40391", @"11620 Main Street Jeffersonville, KY 40337", @"2726 Osborne Road Mt. Sterling, KY 40353", @"99 Union Road Beattyville, KY 41311", @"1523 Hwy 119 North Whitesburg, KY 41815", @"52 KY Route 3224 River, KY 41254", @"2836 State Route 1 Greenup, KY 41144", @"45 Katherine Lane Greenup, KY 41144", @"1483 Big Run Road Wallingford, KY 41093", @"430 Wallacetown Road Paint Lick, KY 40461", @"9730 KY 136W Calhoun, KY 42327", @"4818 Hwy 144 Owensboro, KY 42303", @"88 Noe Lane Russellville, KY 42276", @"59 Williams Cemetery Rd. Hodgenville, KY 42748", @"1114 KY Hwy 829 Albany, KY 42602", @"680 Dug Hill Rd. Elk Horn, KY 42733", @"975 Frankfort Rd. Lawrenceburg, KY 40342", @"164 Old Peonia Loop Clarkson, KY 42726", nil]; 

    displayItems = [[NSMutableArray alloc]initWithArray:title]; 

    searchBar.showsCancelButton = YES; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return [displayItems count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *marketListIdentifier = @"SimpleTableItem"; 
    UIImageView *image = [[UIImageView alloc]init]; 
    image.image = [UIImage imageNamed:@"CellImage.png"]; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:marketListIdentifier]; 

    if (cell == nil) 
    { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:marketListIdentifier]; 
    } 

    cell.textLabel.font = [UIFont fontWithName:@"FranklinGothicStd-ExtraCond" size:20.0]; 
    cell.textLabel.backgroundColor = [UIColor clearColor]; 
    cell.textLabel.highlightedTextColor = [UIColor darkGrayColor]; 
    cell.textLabel.textColor = [UIColor whiteColor]; 
    cell.detailTextLabel.font = [UIFont fontWithName:@"FranklinGothicStd-ExtraCond" size:14.0]; 
    cell.detailTextLabel.backgroundColor = [UIColor clearColor]; 
    cell.detailTextLabel.highlightedTextColor = [UIColor darkGrayColor]; 
    cell.detailTextLabel.textColor = [UIColor whiteColor]; 

    cell.backgroundView = image; 

    cell.textLabel.text = [displayItems objectAtIndex:indexPath.row]; 
    cell.detailTextLabel.text = [subtitle objectAtIndex:indexPath.row]; 

    DTCustomColoredAccessory *accessory = [DTCustomColoredAccessory accessoryWithColor:cell.textLabel.textColor]; 
    accessory.highlightedColor = [UIColor darkGrayColor]; 
    cell.accessoryView =accessory; 

    return cell; 
} 

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText 
{ 
    if ([searchText length] == 0) 
    { 
     [displayItems removeAllObjects]; 
     [displayItems addObjectsFromArray:title]; 
    } 
    else 
    { 
     [displayItems removeAllObjects]; 
     for (NSString *string in title) 
     { 
      NSRange r = [string rangeOfString:searchText options:NSCaseInsensitiveSearch]; 
      if (r.location != NSNotFound) 
      { 
       [displayItems addObject:string]; 
      } 
     } 
    } 
    [tableView reloadData]; 
} 

- (void)searchBarSearchButtonClicked:(UISearchBar *)aSearchBar 
{ 
    [searchBar resignFirstResponder]; 
} 

- (void)searchBarCancelButtonClicked:(UISearchBar *)aSearchBar 
{ 
    [searchBar resignFirstResponder]; 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

@end 

편집 :

여기 내 코드입니다 나는 제목과 자막 키를 지금 사전을 사용하려고 해요하지만이보기를 열 때 응용 프로그램이 충돌한다.

다음은 사전을 만드는 방법입니다.

keys = [NSArray arrayWithObjects:@"titleKey", @"subtitleKey", nil]; 
    objects = [[NSMutableArray alloc]init]; 
    [objects addObject:title]; 
    [objects addObject:subtitle]; 

    marketDictionary = [[NSMutableDictionary alloc]init]; 

    marketDictionary = [NSDictionary dictionaryWithObjects:objects forKeys:keys]; 

    farmMarkets = [[NSMutableArray alloc]initWithObjects:marketDictionary, nil]; 

    displayItems = [[NSMutableArray alloc]initWithArray:farmMarkets]; 

다음은 셀 제목과 부제를 설정하는 방법입니다. 이 첫 번째 줄에서 앱이 다운됩니다.

cell.textLabel.text = [[displayItems objectAtIndex:indexPath.row]objectForKey:@"titleKey"]; 
    cell.detailTextLabel.text = [[displayItems objectAtIndex:indexPath.row]objectForKey:@"subtitleKey"]; 

다음은 로그의 오류입니다.

2013-06-19 15:16:16.240 KFBNewsroom[13461:c07] -[__NSArrayM isEqualToString:]: unrecognized selector sent to instance 0x12745290 
2013-06-19 15:16:16.241 KFBNewsroom[13461:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM isEqualToString:]: unrecognized selector sent to instance 0x12745290' 

답변

1

나는 별도의 배열보다는 함께 당신의 제목과 자막을 저장하는 것이 좋습니다. @ "title"및 @ "subtitle"키가있는 사전 배열을 사용하거나 이러한 속성으로 사용자 정의 모델 객체를 만들 수 있습니다.

어느 쪽이든, 당신이해야 할 일은 해당 자막 문자열에 제목 문자열과 함께 사용하는 것과 동일한 논리를 적용하는 것입니다. 데이터 구조를 변경하지 않고 당신은 다음과 같이 당신의 searchBar:textDidChange: 논리를 업데이트 할 수 있습니다 : searchText 제목 문자열이나 자막 문자열 중 하나 일 수 있습니다

for (NSUInteger i = 0; i < [title count]; i++) 
{ 
    if (([[title objectAtIndex:i rangeOfString:searchText options:NSCaseInsensitiveSearch] != NSNotFound) || ([[subtitle objectAtIndex:i rangeOfString:searchText options:NSCaseInsensitiveSearch] != NSNotFound)) { 
     [displayItems addObject:string]; 
    } 
} 

이 방법을.

참고 : 설명서를 보거나 Xcode의 자동 완성을 사용하지 않고 입력 했으므로 오타, 맞춤법 오류 또는 구문 오류가있을 수 있습니다.

UPDATE : 나는 당신의 farmMarkets 배열의 구조가 잘못 생각하여 편집의 정보를 바탕으로

. 원하는 것은 farmMarkets 배열에 각 시장에 대한 NSDictionary가 포함되도록하는 것입니다. 각 개별 사전에는 @ "title"과 @ "subtitle"키가 있습니다.이 같은 farmMarkets를 초기화 할 수 있습니다 시각화이 쉽게 만들려면 :

NSArray *farmMarkets = @[ 
    @{@"title"  : @"Cates Farm", 
     @"subtitle" : @"Hwy 425 Henderson, KY 42420"}, 

    @{@"title"  : @"Broadbent B & B Foods", 
     @"subtitle" : @"257 Mary Blue Road Kuttawa, KY 42055"}, 

    @{@"title"  : @"Cayce's Pumpkin Patch", 
     @"subtitle" : @"153 Farmersville Road Princeton, KY 42445"} 
]; 

(참고로, 그냥 @있는 NSArray과를 만듭니다 [의 객체 목록] @있는 NSString을 만들 것 "자위대"@ {키 값, 키 값이}이 (가)있는 NSDictionary를 작성합니다) 그런 다음 당신의 세포에 대한 정보를 얻기 위해이 작업을 수행 할 수 있습니다

:.

cell.textLabel.text = [[displayItems objectAtIndex:indexPath.row] objectForKey:@"title"]; 
cell.detailTextLabel.text = [[displayItems objectAtIndex:indexPath.row] objectForKey:@"subtitle"]; 
+0

나는 그것이 사전 작업을 만들려고을하지만, 문제가있다. 나는 원래의 글을 내가 시도하고있는 것으로 올렸다. – raginggoat

+0

당신이'[__NSArrayM isEqualToString :] : 인스턴스를 보낸 인식 할 수없는 선택자 '를 얻는다고 displayItems 배열에 marketDictionary 인 단일 항목이 포함되어 있기 때문입니다. 내가 코멘트에서 코드를 포맷 할 수 있다고 생각하지 않기 때문에 더 자세한 정보로 나의 대답을 업데이트 할 것이다. – Alex

+0

얼마나 많은 아이템을 넣어야하는지 생각해 보면, 개별적으로 넣는 것보다 더 빠른 방법이 있습니까? – raginggoat

1

두 개의 배열을 갖는 대신 사전 배열을 만들어야합니다.

제목을 검색 할 때 일치하는 단어가 있으면 그 사전을 결과 배열에 넣어야합니다. 이제 사전 배열을 사용하여 제목과 관련된 자막을 검색 할 수 있습니다.

당신은 또한 당신의 cellForRowAtIndexPath 방법에 변화를 아래 수행 할 수 있습니다

cell.textLabel.text = [displayItems objectAtIndex:indexPath.row]; 
int currentIndex = [title indexOfObject:cell.textLabel.text]; 
cell.detailTextLabel.text = [subtitle objectAtIndex:currentIndex]; 
관련 문제