我已经创建了一个表,根据您单击的单元格,您将被发送到新场景(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;
}
事先非常感谢你!!
答案 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];
希望这有帮助。