我遇到了问题,我使用UITableView
创建了CoreData
,以便在UITableView
的{{1}}到DetailView
视图之间传递数据我用这个方法:
row
一切正常。但后来我添加了- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"UpdateData"]) {
NSManagedObject *selectedDevice = [self.datas objectAtIndex:
[[self.tableView indexPathForSelectedRow] row]];
DetailViewController *destViewController = segue.destinationViewController;
destViewController.datas = selectedDevice;
}
}
,但UISearchBar
无效,因此我创建了另一个NSManagedObject
,其中我保存了NSMutableArray
组成NSStrings
的所有cell.textLabel.text
。但是现在我需要修改prepareForSegue
,以便每当我从SearchBar tableView中选择一行时执行segue
。
问题是要执行此类segue
与CoreData
的关联我需要使用NSManagedObject
,所以我的问题是:
如何从indexPath.row
内的UISearchBar
获取UITableView
,并使其与indexPath.row
的{{1}}对应(我使用的数组)要在self.data
中执行正常segue
,请参阅代码)?
我以为我可以比较单元格的字符串(cell.textLabel.text),但
任何建议?
编辑:我在故事板中添加了UISearchBar,这是我用来过滤主表视图的代码:
UITableView
其中- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
[_searchDati removeAllObjects];
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@", searchText];
_searchDati = [NSMutableArray arrayWithArray:[_tableData filteredArrayUsingPredicate:resultPredicate]];
}
-(BOOL)searchDisplayController:(UISearchDisplayController *)controller
shouldReloadTableForSearchString:(NSString *)searchString
{
[self filterContentForSearchText:searchString
scope:[[self.searchDisplayController.searchBar scopeButtonTitles]
objectAtIndex:[self.searchDisplayController.searchBar
selectedScopeButtonIndex]]];
return YES;
}
是我为UISearchBar创建的数组,而_searchDati
是我创建的数组,用于存储包含CoreDatas的NSManagedObject中的单元名称。
我还添加了这个
_tableData
第一个是因为我使用了这个,我需要注册课程或者给我一个错误
- (void)searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView
{
[tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
}
//Handle selection on searchBar
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
if (tableView == self.searchDisplayController.searchResultsTableView) {
[self performSegueWithIdentifier: @"UpdateData" sender: self];
}
}
和第二个处理UISearchBarTableView的选择。
在这里我按照之前的说法加载tableView
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
修改#2:
我写了这段代码NSIndexPath * indexPath = nil; NSIndexPath * indexPath2 = nil;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
if (tableView == self.searchDisplayController.searchResultsTableView) {
// see filter method
cell.textLabel.text = [_searchDati objectAtIndex:indexPath.row];
} else {
NSString *string;
NSManagedObject *data = [self.datas objectAtIndex:indexPath.row];
string = [NSString stringWithFormat:@"%@", [data valueForKey:@"name"]];
[cell.detailTextLabel setText:nil];
cell.textLabel.text = string;
//store the string to the tableView array
[_tableData addObject:string];
}
return cell;
}
当我点击UISearchBar上的一行时,它只是第一次工作!我进行搜索并单击该行,它会转到右侧的DetailView,但是如果我再次执行它会崩溃给我这个错误
if ([self.searchDisplayController isActive]) {
indexPath = [self.searchDisplayController.searchResultsTableView indexPathForSelectedRow];
for(int i = 0 ; i < _tableData.count ; i++){
if([self.searchDati[indexPath.row] isEqualToString:_tableData[i]]){
indexPath2 = [NSIndexPath indexPathForRow:i inSection:1];
}
}
NSManagedObject *selectedDevice = [self.datas objectAtIndex:indexPath2.row];
destViewController.datas = selectedDevice;
我认为问题是不是从indexPath.row == 0开始,而是在第一次之后创建一堆。 有什么建议吗?在此先感谢:)
答案 0 :(得分:0)
试试这个,
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"UpdateData"]) {
NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
NSManagedObject *selectedDevice = [self.datas objectAtIndex:indexPath.row];
DetailViewController * destViewController = [segue destinationViewController];
destViewController.datas = selectedDevice;
}
}