由于搜索栏,Segue不起作用

时间:2014-01-25 22:25:01

标签: objective-c object search segue

我已经创建了一个表,根据您单击的单元格,您将被发送到新场景(detailviewcontroller)。例如,如果单击带有文本Thailand的单元格,您将被发送到ThailandDetailViewController(场景)。一切正常,直到您使用搜索栏(查看 - (void)tableView)。

- 当一些国家过滤时(由于搜索功能),扩孔国家将在表格中走得更高并获得更低的数量。这导致他们将导致错误的detailviewcontroller(场景)。

我的一个朋友告诉我,我应该在我的数组中使用objectAtIndex,并没有真正意识到他的意思..然后切换cell.textLabel.text(并没有真正跟随他)

这是我的.m文件:

- (void)viewDidLoad
{
[super viewDidLoad];
self.mySearchBar.delegate = self;
self.myTableView.delegate = self;
self.myTableView.dataSource = self;

totalStrings = [[NSMutableArray alloc] initWithObjects:@"America",@"Austria",@"Canada",@"France",@"Germany",@"Greece",@"Malaysia",@"Mexico",@"Netherlands",@"Poland",@"Russia",@"Singapore",@"Thailand",@"Ukraine", nil];    
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

switch (indexPath.row) {
    case 0: [self performSegueWithIdentifier:@"Segue0" sender:self];
        break;
    case 1: [self performSegueWithIdentifier:@"Segue1" sender:self];
        break;
    //and so on
    default: break;
}
}

-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
if(searchText.length == 0){
    isFiltered = NO;
}
else
{
    isFiltered = YES;
    filteredStrings = [[NSMutableArray alloc]init];
    for (NSString *str in totalStrings){
        NSRange stringRange = [str rangeOfString:searchText      options:NSCaseInsensitiveSearch];
        if(stringRange.location !=NSNotFound) {
             [filteredStrings addObject:str];
        }
    }
}
[self.myTableView reloadData];
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath   *)indexPath
{
static NSString *Cellidentifier = @"cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Cellidentifier];

if (!cell) {
    cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:Cellidentifier];
}
if (!isFiltered) {
    cell.textLabel.text = [totalStrings objectAtIndex:indexPath.row];
}
else //if it's filtered
{
    cell.textLabel.text = [filteredStrings objectAtIndex:indexPath.row];
}
return cell;
}

事先非常感谢你!!

2 个答案:

答案 0 :(得分:0)

您可以通过在表的数据模型中存储自定义对象而不是NSString来轻松解决此问题。该对象将包含要显示的标签以及一旦选定就激活的segue的名称。

这是另一个问题,为什么你需要一个完全不同的视图控制器来处理不同的数据。我想这些是需要不同方法来处理它们的不同类型的数据。

答案 1 :(得分:0)

好吧,您可以使用自定义类来存储区域和segue索引,如下所示:

@interface SegueVO : NSObject
@property (nonatomic, strong) NSString *area;
@property int segueIndex;
-(id)initWithArea:(NSString *)area andSegueIndex:(int)index;
@end

@implementation SegueVO
-(id)initWithArea:(NSString *)area andSegueIndex:(int)index
{
    self = [super init];
    if (self)
    {
        self.area = area;
        self.segueIndex = index;
    }
    return self;
}
@end

然后,您将把你的ares存储在totalStrings数组中,如下所示:

[[NSMutableArray alloc] initWithObjects:[[SegueVO alloc] initWithArea:@"America" andIndex:0],....

当然,您可以创建一个工厂方法来减少初始化代码。

现在你可以找出像这样激活的segue:

NSArray *arrayToUse = totalStrings;
if (isFiltered)
   arrayToUse = filteredStrings;

[self performSegueWithIdentifier:[@"Segue" 
 stringByAppendingString:[NSString stringWithFormat:@"%i", 
 [arrayToUse[indexPath.row].segueIndex]] sender:self];

希望这有帮助。