出于某种原因,NSPredicate没有过滤我的UITableView?

时间:2013-05-26 16:19:27

标签: objective-c uitableview view nspredicate xcode4.6

由于某些原因,NSPredicate没有过滤我的UITableView(它应该通过UIPickerView中的选择来过滤我的TableView)。用户选择选择器视图,按下GO按钮(segue从Pickerview连接到Table View控制器)。

知道它为什么不起作用吗?请参阅下面的代码。

ViewController.m(表格视图控制器)

  - (int)numberOfSectionsInTableView: (UITableView *)tableview
        {
            return 1;
        }

        - (int)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
        {
            if (tableView == self.searchDisplayController.searchResultsTableView) {
                return [searchResults count];
            } else {
                return [Strains count];
            }
        }

        - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
        {
            static NSString *strainTableIdentifier = @"StrainTableCell";

            StrainTableCell *cell = (StrainTableCell *)[tableView dequeueReusableCellWithIdentifier:strainTableIdentifier];
            if (cell == nil)
                cell = [[StrainTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:strainTableIdentifier];

            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"StrainTableCell" owner:self options:nil];
            cell = [nib objectAtIndex:0];

            if (tableView == self.searchDisplayController.searchResultsTableView) {
                NSLog(@"Using the search results");

                cell.titleLabel.text = [[searchResults objectAtIndex:indexPath.row] objectForKey:@"Title"];
                cell.descriptionLabel.text = [[searchResults objectAtIndex:indexPath.row] objectForKey:@"Description"];
                cell.ratingLabel.text = [[searchResults objectAtIndex:indexPath.row] objectForKey:@"Rating"];
                cell.ailmentLabel.text = [[searchResults objectAtIndex:indexPath.row] objectForKey:@"Ailment"];
                cell.actionLabel.text = [[searchResults objectAtIndex:indexPath.row] objectForKey:@"Action"];
                cell.ingestLabel.text = [[searchResults objectAtIndex:indexPath.row] objectForKey:@"Ingestion"];

                NSLog(@"%@", searchResults);
            } else {
                NSLog(@"Using the FULL LIST!!");

                cell.titleLabel.text = [[Strains objectAtIndex:indexPath.row] objectForKey:@"Title"];
                cell.descriptionLabel.text = [[Strains objectAtIndex:indexPath.row] objectForKey:@"Description"];
                cell.ratingLabel.text = [[Strains objectAtIndex:indexPath.row] objectForKey:@"Rating"];
                cell.ailmentLabel.text = [[Strains objectAtIndex:indexPath.row] objectForKey:@"Ailment"];
                cell.actionLabel.text = [[Strains objectAtIndex:indexPath.row] objectForKey:@"Action"];
                cell.ingestLabel.text = [[Strains objectAtIndex:indexPath.row] objectForKey:@"Ingestion"];        
            }
            return cell;
        }


        - (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
        {
            NSPredicate *resultPredicate = [NSPredicate
                                            predicateWithFormat:@"SELF contains[cd] %@",
                                            searchText];

                searchResults = [Strains filteredArrayUsingPredicate:resultPredicate];
            }


            -(BOOL)searchDisplayController:(UISearchDisplayController *)controller
            shouldReloadTableForSearchString:(NSString *)searchString
            {
                [se

    lf filterContentForSearchText:searchString
                                       scope:[[self.searchDisplayController.searchBar scopeButtonTitles]
                                              objectAtIndex:[self.searchDisplayController.searchBar
                                                             selectedScopeButtonIndex]]];
            return YES;
        }

        - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

            StrainDetailViewController *detailViewController = [[StrainDetailViewController alloc] initWithNibName:@"StrainDetailViewController" bundle:nil]; if ([searchResults count]) {

                detailViewController.title = [[searchResults objectAtIndex:indexPath.row] objectForKey:@"Title"];
                detailViewController.strainDetail = [searchResults objectAtIndex:indexPath.row];

            } else {

                detailViewController.title = [[Strains objectAtIndex:indexPath.row] objectForKey:@"Title"];
                detailViewController.strainDetail = [Strains objectAtIndex:indexPath.row];
                NSLog(@"%@", Strains);
            }

            [self.navigationController pushViewController:detailViewController animated:YES];
        }

- (void)PickerViewControllerDidFinish:(PickerViewController *)viewController {
  [self.navigationController popViewControllerAnimated:YES];

}

PickerViewController.h

@protocol PickerViewControllerDelegate;

@interface PickerViewController : UIViewController {


    UIPickerView *pickerView;

    NSMutableArray *array1;
    NSMutableArray *array2;
    NSMutableArray *array3;



    NSArray *Strains;
    NSArray *searchResults;

    NSMutableData *data;



}

- (IBAction)buttonpressed:(UIButton *)sender;

@property (nonatomic, weak) id<PickerViewControllerDelegate> delegate;

@property (nonatomic, retain) IBOutlet UIPickerView *pickerView;

- (void)populateArray1;
- (void)populateArray2;
- (void)populateArray3;




@end

@protocol PickerViewControllerDelegate <NSObject>

- (void)PickerViewControllerDidFinish:(PickerViewController*)viewController;

@end

PickerViewController.m

@implementation PickerViewController

- (void)handleCloseButton:(id)sender {
    if ([self.delegate respondsToSelector:@selector(PickerViewControllerDidFinish:)]) {
        [self.delegate PickerViewControllerDidFinish:self];

    }
}

@synthesize pickerView;


    #pragma mark -
    #pragma mark picker view methods
    - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView;
    {
        return 3;
    }

    - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
    {
        if (component == 0)
        {
            NSLog(@"you selected %@", [array1 objectAtIndex:row]);            
        }

        if (component == 1)
        {
            NSLog(@"you selected %@", [array2 objectAtIndex:row]);            
        }

        if (component == 2)
        {
            NSLog(@"you selected %@", [array3 objectAtIndex:row]);            
        }
    }    

    - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component;
    {
        if (component == 0)
        {
            return [array1 count];
        }

        if (component == 1)
        {
            return [array2 count];
        }    

        if (component == 2)
        {
            return [array3 count];
        }    
        else
        {
            return [array1 count];
        }
    }

    - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component;
    {        
        if (component == 0)
        {
            return [array1 objectAtIndex:row];
        }

        if (component == 1)
        {
            return [array2 objectAtIndex:row];
        }

        if (component == 2)
        {
            return [array3 objectAtIndex:row];
        }        
        else
        {
            return [array2 objectAtIndex:row];
        }
    }

    - (void)populateArray1
    {
        array1 = [[NSMutableArray alloc] init];

        [array1 addObject:@"Arthritis"];
        [array1 addObject:@"Cancer"];
        [array1 addObject:@"HIV"];
        [array1 addObject:@"Migraines"];
            [array1 addObject:@"Insomnia"];      
        }    

        - (void)populateArray2
        {
            array2 = [[NSMutableArray alloc] init];

            [array2 addObject:@"Nausea"];
            [array2 addObject:@"Pain"];
            [array2 addObject:@"Appetite"];
            [array2 addObject:@"Fever"];
                [array2 addObject:@"Exhaustion"];        
            }

            - (void)populateArray3
            {
                array3 = [[NSMutableArray alloc] init];

                [array3 addObject:@"Oil"];
                [array3 addObject:@"Plant"];
                [array3 addObject:@"Edible"];
                [array3 addObject:@"Powder"];


             }

         - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // Make sure your segue name in storyboard is the same as this line
    if ([[segue identifier] isEqualToString:@"pickerGo"])
    {
        // Get reference to the destination view controller
        ViewController *strainTableView = [(UINavigationController *)[segue destinationViewController] topViewController];

        NSPredicate *ailmentPredicate = [NSPredicate predicateWithFormat:@"Ailment contains[cd] %@", [pickerView selectedRowInComponent:0]];

        NSPredicate *actionPredicate = [NSPredicate predicateWithFormat:@"Action contains[cd] %@", [pickerView selectedRowInComponent:1]];

        NSPredicate *ingestPredicate = [NSPredicate predicateWithFormat:@"Ingestion contains[cd] %@", [pickerView selectedRowInComponent:2]];


        NSCompoundPredicate *resultPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:[NSArray arrayWithObjects: ailmentPredicate,actionPredicate,ingestPredicate, nil]];

        searchResults = [Strains filteredArrayUsingPredicate:resultPredicate];

        // Pass any objects to the view controller here, like...
        [strainTableView setSearchResults: searchResults];
    }
}

1 个答案:

答案 0 :(得分:1)

你的谓词:

NSPredicate *resultPredicate = 
[NSPredicate predicateWithFormat:@"SELF contains[cd] %@",  searchText];

searchResults = [Strains filteredArrayUsingPredicate:resultPredicate];

看起来试图使用“Strain”对象(你没有给出一个定义,但肯定是复合对象)作为字符串对象。

CONTAINS [cd]是一个字符串比较函数。

定义您的谓词更像是您为选择器使用的复合版本。