問題が発生しました。ビュー間でデータを渡すためにUITableView
usingを作成しました ( toの a )。このメソッドを使用しました。CoreData
UITableView
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
別の を作成し、動作しました。しかし、SearchBar tableView から行を選択するたびに実行するために、を変更する必要があります。NSMutableArray
NSStrings
cell.textLabel.text
prepareForSegue
segue
問題は、この種の とのsegue
接続を実行するには、CoreData
を使用する必要があることNSManagedObject
です。したがって、私の質問は、my の内部indexPath.row
から を取得し、それを myの右側に対応させるにはどうすればよいかということです (これは、実行に使用した配列です)。の法線、コードを参照) ? セル(cell.textLabel.text)の文字列を比較できると思ったのですが、UISearchBar
UITableView
indexPath.row
self.data
segue
UITableView
- やり方がわからない。
- 同じ名前の行が 2 つあると、問題が発生する可能性があります。
何かアドバイス?
編集:ストーリーボードから UISearchBar を追加しました。これは、メイン テーブル ビューをフィルター処理するために使用するコードです。
- (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
用に作成した_tableData
配列と、CoreDatas を含む NSManagedObject のセルの名前を格納するために作成した配列はどこにありますか。
そして私もこれを追加しました
- (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];
}
}
最初はこれを使用し、クラスを登録する必要があるか、エラーが発生したためです
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
もう 1 つは UISearchBarTableView の選択を処理します。
ここで、前に言ったようにtableViewをロードします
- (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;
}
編集#2:
私はこのコードを書きました
NSIndexPath *indexPath = nil; NSIndexPath *indexPath2 = nil;
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;
UISearchBar の行をクリックすると、初めて機能します。検索を行って行をクリックすると、右側の DetailView に移動しますが、もう一度実行するとクラッシュしてこのエラーが発生します
Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 5 beyond bounds [0 .. 4]'
問題は、indexPath.row == 0 から開始するのではなく、初回の後に一種の山を作成することだと思います。なにか提案を?前もって感謝します :)