0

suitsArrayは、ボタンが選択された状態のときにオブジェクト(単語)が追加されたMutableArrayです。

次の部分では、suitsCriteriaStringを、単語とsuitsArray区切るスペースのみを含むクリーンな文字列 にする必要があります。つまり、コンマやその他の記号は使用しません。(NSSetか何かで?)

NSString *suitsCriteriaString = [NSString stringWithFormat:@"%@", suitsArray];
NSString *wineSuitsString = [wine objectForKey:@"Suits"];
NSRange range = [wineSuitsString rangeOfString:suitsCriteriaString options:NSCaseInsensitiveSearch];

次に、NSRangeは、正しく実行された場合、suitsCriteriaString内の単語がwineSuitsString存在するかどうかを確認する必要があります。次に、一致する単語のみを含むように結果をフィルタリングする必要があります。

私の検索機能のコードは次のとおりです。これを機能させるためにさらに情報が必要な場合はお知らせください。


SearchViewController.h


#import <UIKit/UIKit.h>

@interface SearchViewController : UIViewController {

@property (nonatomic, strong) NSMutableArray *allObjectsArray;
@property (nonatomic, strong) NSMutableArray *resultObjectsArray;

@property (nonatomic, strong) NSMutableArray *suitsArray;

@property (nonatomic, retain) IBOutlet UISlider *minPrisSlider;
@property (nonatomic, retain) IBOutlet UISlider *maxPrisSlider;

-(IBAction)searchButtonPressed:(id)sender;

@end

SearchViewController.m:


allObjectsArrayを埋めます:

- (void)viewDidLoad
{
[super viewDidLoad];

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"Wine.plist"];
allObjectsArray = [[NSMutableArray alloc] initWithContentsOfFile:path];
}

SuitsArrayにオブジェクトを追加または削除します。これに似たボタンが10個あります。

-(IBAction)lambButtonPressed:(id)sender
{
if (lambButtonSelected == 0) {

    lambButtonSelected = 1;
    [suitsArray addObject:@"lamb"];

} else {

    lambButtonSelected = 0;
    [suitsArray removeObject:@"lamb"];

}
}

次に、検索結果にオブジェクトを追加します。

-(IBAction)searchButtonPressed:(id)sender{  

resultObjectsArray = [NSMutableArray array];
for(NSDictionary *wine in allObjectsArray)

    {

    //String for price
    NSString *winePrice = [wine objectForKey:@"Price"];        

    /*THIS IS WHERE I'M TRYING TO CHECK IF THE WORDS IN suitsCriteriaString
    ARE EXISTING IN wineSuitsString */

    NSString *suitsCriteriaString = [NSString stringWithFormat:@"%@", suitsArray];
    NSString *wineSuitsString = [wine objectForKey:@"Suits"];
    NSRange range = [wineSuitsString rangeOfString:suitsCriteriaString options:NSCaseInsensitiveSearch];


    //THEN LAST, ADD OBJECTS WITH MATCH OF PRICE CRITERIA AND SUITS CRITERIA TO RESULTS:

    BOOL priceConditionGood = YES;
    if (minPrisSlider.value <= maxPrisSlider.value && (winePrice.floatValue < minPrisSlider.value || winePrice.floatValue > maxPrisSlider.value))
        priceConditionGood = NO;
    if (range.location != NSNotFound && priceConditionGood)
        [resultObjectsArray addObject:wine];
     }
     }

//AND PUSH RESULTS CONTROLLER:

ResultsTableViewController *nextController = [[self storyboard] instantiateViewControllerWithIdentifier:@"ResultsController"];
nextController.objectsArray = [[NSMutableArray alloc]initWithArray:resultObjectsArray];
[self.navigationController pushViewController:nextController animated:YES];
}
4

2 に答える 2

1

これは、componentsJoinedByString:メソッドを使用して次のように行うことができます。

NSString *suitsCriteriaString = [suitsArray componentsJoinedByString:@" "];
NSString *wineSuitsString = [wine objectForKey:@"Suits"];
NSRange range = [wineSuitsString rangeOfString:suitsCriteriaString options:NSCaseInsensitiveSearch];
于 2012-08-13T14:12:20.333 に答える
1

「suitsCriteriaString」はあなたが望むものを提供するつもりはありません。「suitsArray」を繰り返し処理して各単語を比較する方がはるかに簡単です。

NSString *wineSuitsString = [wine objectForKey:@"Suits"];
BOOL foundMatch = true;
for (NSString *suit in suitsArray) {
  NSRange range = [wineSuitsString rangeOfString:suit options:NSCaseInsensitiveSearch];
  if (range.location == NSNotFound) {
    foundMatch = false;
    break;
  }
}
于 2012-08-13T14:36:23.770 に答える