3

我正在制作一个显示红酒信息的 iPhone 应用程序。葡萄酒存储在一个包含字典数组的 plist 中。我正在向应用程序添加一个搜索视图控制器,为了轻松启动,我想获取“名称”键的值包含名称字符串(来自文本框)的葡萄酒。

它停在这里,我需要一些关于最合适的方法的建议。NSArray 类中是否有一个函数可以完成这项工作,应该引入 NSPredicate、NSUserDefaults 还是有其他选项?我已经做了一些研究,但我需要一些建议,也许需要一个例子来开始。

我将推进搜索功能,让用户包括/排除国家,获得适合这种和那种食物的葡萄酒,设置最低价格,最高价格等等。字典有所有这些信息的字符串。所以在我开始像这样高级的东西之前,我需要一些建议,哪些功能可以最好地完成我的工作。

-(IBAction)searchButtonPoke:(id)sender{

    NSString *path = [[NSBundle mainBundle] pathForResource:@"Wines" ofType:@"plist"];
    allObjectsArray = [[NSMutableArray alloc] initWithContentsOfFile:path];

    NSString *nameString = [NSString stringWithFormat:@"%@", [nameTextField text]];

    resultObjectsArray = /*objects where the value for the key "Name" contains
                                                                   nameString*/;
4

4 回答 4

10

简单地遍历数组并比较名称怎么样?

resultObjectsArray = [NSMutableArray array];
for(NSDictionary *wine in allObjectsArray)
{
   NSString *wineName = [wine objectForKey:@"Name"];
   NSRange range = [wineName rangeOfString:nameString options:NSCaseInsensitiveSearch];
   if(range.location != NSNotFound)
     [resultObjectsArray addObject:wine];
}

Swift 版本更简单:

let resultObjectsArray = allObjectsArray.filter{
    ($0["Name"] as! String).range(of: nameString,
                                  options: .caseInsensitive,
                                  range: nil,
                                  locale: nil) != nil
}

干杯,安卡

于 2012-07-31T00:05:27.080 回答
7

这有效!经测试!!!

for (NSDictionary* dict in Array) {

    if ([[dict objectForKey:@"key"] isEqualToString:string]) {

        Index = [Array indexOfObject:dict];
    }
}
于 2013-11-29T07:50:22.497 回答
2

我们也可以使用 NSPredicate,如下所示:

NSPredicate *predicate =
  [NSPredicate predicateWithFormat:@"publisher == %@", @"Apress" ];
NSArray *filtered  = [bookshelf filteredArrayUsingPredicate:predicate];

如果可以在书架数组中找到出版商,则过滤计数将大于 0。

我认为这种方式是更清洁的搜索方式。希望能帮助到你。

于 2014-04-09T00:31:09.903 回答
0

记得打破;找到对象后退出 for 循环

于 2018-05-03T16:14:21.993 回答