2

編集:

私が見つけたのは:UISearchBarDisplayControllerの結果からdetailViewControllerにセグエする方法

これを見ていきます!


ストーリーボードを使用して、「検索バーと検索表示コントローラー」をコアデータfetchedResultsControllerと組み合わせています。つまり、次のことを区別する必要があります。

if (self.tableView == self.searchDisplayController.searchResultsTableView) {
    ...

データストアから取得した結果を一覧表示した場合。

ただし、次の場合、正しい行(インデックスパス)を取得できません。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"StoreDetails"]) {
        UINavigationController *navigationController = segue.destinationViewController;
        StoreDetailsTableViewController *controller = (StoreDetailsTableViewController *)navigationController.topViewController;
        controller.managedObjectContext = self.managedObjectContext;

        Store *storeToDetail = nil;
        NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];  // This gives wrong row when having searched using searchDisplayController
        NSLog(@"Row: %i", indexPath.row);                                                   // row is always 0
        if (self.tableView == self.searchDisplayController.searchResultsTableView) {
            storeToDetail = [self.filteredListContent objectAtIndex:indexPath.row];
        } else {
            storeToDetail = [self.fetchedResultsController objectAtIndexPath:indexPath];
        }

         controller.storeToDetail = storeToDetail;
    }
}

これは後に呼び出されます:

- (BOOL)searchDisplayController:(UISearchDisplayController *)controller       shouldReloadTableForSearchString:(NSString *)searchString
{
    [self filterContentForSearchText:searchString scope:@"All"];
    ...

と:

- (void)filterContentForSearchText:(NSString*)searchText scope:(NSString*)scope
{
    [self.filteredListContent removeAllObjects];

    for (Store *store in [self.fetchedResultsController fetchedObjects])
    {
        if ([scope isEqualToString:@"All"] || [store.name isEqualToString:scope])
        {
            NSComparisonResult result = [store.name compare:searchText options:(NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch) range:NSMakeRange(0, [searchText length])];
            if (result == NSOrderedSame)
            {
                [self.filteredListContent addObject:store];
            }
        }
    }
}

これはAppleのTableSearchの例から取られています。

元の問題は2つあります。

1)self.tableViewがself.searchDisplayController.searchResultsTableViewと等しくないようですprepareForSegue

2)indexPath(行)を検索したことは常に0です。

didSelectRow ...を代わりに、または組み合わせて使用​​できると思いますが、prepare ...は可能であると思いますか?!また、didSelectRowを試してみると、関連する行から宛先コントローラーにオブジェクトを渡す方法がわかります。つまり、didSelectRowで正しいindexPathを取得できますが、preparForでセグエの宛先を取得する方法しかわかりません...:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{
    Store *storeToDetail = nil;
    if (tableView == self.searchDisplayController.searchResultsTableView)
    {
        storeToDetail = [self.filteredListContent objectAtIndex:indexPath.row];
    }
    else
    {
        storeToDetail = [self.fetchedResultsController objectAtIndexPath:indexPath];
    }

    // How to get segue destination controller and set object?!
    // Before doing:
    [self performSegueWithIdentifier:@"StoreDetails" sender:self];
}

どんな助けでも大歓迎です。たぶん、これらのものを組み合わせる方法を示すチュートリアルへの参照。

ありがとうございました!

4

3 に答える 3

4

この場合、 のsender引数はprepareForSegue:sender:、セグエを開始するテーブル ビュー セルに設定されます。

このセルに属するプロパティをセルに追加するだけStoreで、インデックス パスやテーブル ビューの比較ダンスを行う必要はありません。

次のような単純なものになるはずです

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    FooCell *cell = (FooCell *)[self.tableView dequeueReusableCellWithIdentifier:CELL_IDENTIFIER];
    Foo *foo = [self fooForIndexPath:indexPath];

    cell.foo = foo;
    // additional initialization

    return cell;
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"view detail"]) {
        DetailViewController *destViewController = segue.destinationViewController;
        destViewController.foo = [(FooCell *)sender foo];
    }
}
于 2013-11-06T13:58:26.090 に答える
1

-(void)prepareForSegue:(UIStoryboardSegue *)segue 送信者:(id)送信者

{

if(self.filteredListContent)

{//NSLog(@"フィルタリングされたデータの投稿";}

そうしないと

{//NSLog(@"すべて投稿";}

}

于 2012-04-26T14:54:29.210 に答える