2011-03-31 82 views
4

我有一個tableView作爲我的第一個視圖的程序。我也實現了(或至少試圖)在視圖頂部的搜索欄。用了幾個小時來搜索解決方案,但沒有獲得積極的結果。無效的參數類型爲一元表達式

#import "FirstViewController.h" 
#import "NSDictionary-MutableDeepCopy.h" 


@implementation FirstViewController 

@synthesize listData, table, search, allNames, names, keys; 

#pragma mark - 
#pragma mark Custom Methods 

- (void)resetSearch { 
    NSMutableDictionary *allNamesCopy = [self.allNames mutableDeepCopy]; 
    self.names = allNamesCopy; 
    [allNamesCopy release]; 
    NSMutableArray *keyArray = [[NSMutableArray alloc] init]; 
    [keyArray addObjectsFromArray:[[self.allNames allKeys] 
            sortedArrayUsingSelector:@selector(compare:)]]; 
    self.keys = keyArray; 
    [keyArray release]; 
} 

-(void)handleSearchForTerm:(NSString *)searchTerm { 
    NSMutableArray *sectionsToRemove = [[NSMutableArray alloc] init]; 
    [self resetSearch]; 

    for (NSString *key in self.keys) { 
     NSMutableArray *array = [names valueForKey:key]; 
     NSMutableArray *toRemove = [[NSMutableArray alloc] init]; 
     for (NSString *name in listData) { 
      if ([name rangeOfString:searchTerm 
       options:NSCaseInsensitiveSearch].location == NSNotFound) 
       [toRemove addObject:name]; 
     } 

     if ([array count] == [toRemove count]) 
      [sectionsToRemove addObject:key]; 

     [array removeObjectsInArray:toRemove]; 

     [toRemove release]; 

    } 
    [self.keys removeObjectsInArray:sectionsToRemove]; 
    [sectionsToRemove release]; 
    [table reloadData]; 

} 


- (void)viewDidLoad {  

    NSString *path = [[NSBundle mainBundle] pathForResource:@"sortednames" ofType:@"plist"]; 
    NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path]; 

    self.names = dict; 
    self.allNames = dict; 

    [dict release]; 

    [self resetSearch]; 
    [table reloadData]; 
    [table setContentOffset:CGPointMake(0.0, 44.0)animated:NO]; 

    self.parentViewController.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"background.png"]]; 

    NSArray *array = [[NSArray alloc] initWithObjects: 

// A larger amount of objects here. 

self.listData = array; 

    [array release]; 
    [super viewDidLoad]; 

} 

/* 
// The designated initializer. Override to perform setup that is required before the view is loaded. 
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) { 
// Custom initialization 
} 
return self; 
} 
*/ 

/* 
// Implement loadView to create a view hierarchy programmatically, without using a nib. 
- (void)loadView { 
} 
*/ 

/* 
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. 
- (void)viewDidLoad { 
[super viewDidLoad]; 
} 
*/ 

/* 
// Override to allow orientations other than the default portrait orientation. 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
// Return YES for supported orientations 
return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 
*/ 

- (void)didReceiveMemoryWarning { 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 

    // Release any cached data, images, etc that aren't in use. 
} 

- (void)viewDidUnload { 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 

    self.listData = nil; 
    self.table = nil; 
    self.search = nil; 
    self.allNames = nil; 
    self.names = nil; 
    self.keys = nil; 

} 


- (void)dealloc { 
    [listData release]; 
    [search release]; 
    [table release]; 
    [allNames release]; 
    [keys release]; 
    [names release]; 
    [super dealloc]; 
} 

#pragma mark - 
#pragma mark Table View Data Source Methods 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return ([keys count] > 0) ? [keys count] : 1; 

} 

- (NSInteger)tableView:(UITableView *)aTableView 
numberOfRowsInSection: (NSInteger)section { 
    return [self.listData count]; 
    if ([keys count] == 0) 
     return 0; 
    NSString *key = [keys objectAtIndex:section]; 
    NSArray *nameSection = [names objectForKey:key]; 
    return [nameSection count]; 
} 

- (UITableViewCell *) extracted_method: (UITableViewCell *) cell { 
    return cell; 

} 
- (UITableViewCell *)tableView:(UITableView *)aTableView 

cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    NSUInteger section = [indexPath section]; 
    NSUInteger row = [indexPath row]; 

    NSString *key = [keys objectAtIndex:section]; 
    NSArray *nameSection = [names objectForKey:key]; 

    static NSString *sectionsTableIdentifier = @"sectionsTableIdentifier"; 

    UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier: 
          sectionsTableIdentifier]; 

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

} 

    cell.backgroundColor = [UIColor clearColor]; 
    cell.textColor = [UIColor whiteColor]; 
    cell.detailTextLabel.textColor = [UIColor whiteColor]; 
    cell.text = [nameSection objectAtIndex:row]; 

    [self extracted_method: cell].text = [listData objectAtIndex:row]; 

    return cell; 

} 

    - (NSString *)tableView:(UITableView *)tableView 
    titleForHeaderInSection:(NSInteger)section { 
    if ([keys count] == 0) 
     return nil; 


    NSString *key = [keys objectAtIndex:section]; 
    return key;  

    } 

    -(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView { 
     return keys; 

    } 

#pragma mark - 
#pragma mark Table View Delegate Methods 
     - (NSIndexPath *)tableView:(UITableView *)tableView 
    willSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
      [search resignFirstResponder]; 
      return indexPath; 
    } 


#pragma mark - 
#pragma mark Search Bar Delegate Methods 

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar { 
     NSString *searchTerm = [searchBar text]; 
     [self handleSearchForTerm:searchTerm]; 
} 

- (void)searchBar:(UISearchBar *)searchBar 
textDidChange:(NSString *)searchTerm { 
    if ([searchTerm length] == 0) { 
    [self resetSearch]; 
    [table reloadData]; 
    return; 
} 

    [self handleSearchForTerm:searchTerm]; 
} 


    - (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar { 
     search.text = @""; 
     [self resetSearch]; 
     [table reloadData]; 
     [searchBar resignFirstResponder]; 

} 
@end 

好吧夥計們。我的問題是,這沒有得到搜索功能的工作。此外,我收到交叉口信號SIGABRT在這一行:

NSString *key = [keys objectAtIndex:section]; 

所以我需要有兩件事情幫助:

1:我需要獲得SIGABRT了。

錯誤日誌消息:*終止應用程序由於未捕獲的異常 'NSRangeException',原因: '* - [NSMutableArray的objectAtIndex:]: 索引0超出界限爲空數組'

那就是我沒有在鍵中存儲任何數據。我會怎麼做?我會存儲什麼?

2:要搜索功能在我的listData數組中搜索!

在此先感謝 - 希望你能幫助!

+1

錯誤消息表明編譯器認爲它在看到「 - 」引入您的方法時正在解析表達式。檢查你的括號上面這點匹配是否正確。如果他們發佈更多的上下文代碼。 – CRD 2011-03-31 20:57:40

+0

增加了更多代碼。沒有完全得到你的意思:) – Mathias 2011-03-31 21:04:13

回答

3

你還沒有完成你的sectionIndexTitlesForTableView:方法。現在,它是:

-(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView { 
     return keys; 

沒有結束},所以編譯器認爲一切後,仍然是方法的一部分。當您嘗試定義下一個方法時,請使用使用- (NSIndexPath *)來指示它是返回NSIndexPath *的實例方法,但編譯器認爲您正在嘗試減去某些內容。

解決方法很簡單:將}添加到sectionIndexTitlesForTableView:的末尾。

-(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView { 
     return keys; 
} 
+0

是的,我也想到了我自己。但是,當我在該方法的末尾放置該函數時,它會將程序中的其餘行變爲錯誤......請注意您的幫助:) – Mathias 2011-04-01 16:47:23

+0

我真的不知道我的代碼 - 應該存儲在密鑰中??? – Mathias 2011-04-03 23:04:28

+0

仍然需要幫助.. – Mathias 2011-04-04 08:10:46

相關問題