So wechseln Sie von einem UISearchBarDisplayController-Ergebnis zu einem detailViewController

StackOverflow https://stackoverflow.com/questions/9325103

  •  27-10-2019
  •  | 
  •  

Frage

Mit dem Storyboard können Sie also einen Übergang von der UITableViewCell vom ersten tableViewController zu einem detailViewController erstellen.

Nicht allzu kompliziert, aber wenn ein UISearchBarDisplayController in den Storyboard-Mix eingeführt wird, wie können Sie die Ergebniszelle in den detailViewController überführen?

Ich kann problemlos suchen, ich habe dieses Tutorial befolgt: http://clingingtoideas.blogspot.com/2010/02/uitableview-how-to-part-2-search.html

Ich kann nur eine Zeile aus der Suche auswählen, sie wird blau und geht nicht zum detailViewController.

Ich habe die Methode PrepareForSegue implementiert, die für die nicht durchsuchten Zellen funktioniert, kann diese aber nicht herausfinden.

War es hilfreich?

Lösung 3

Ok, ich glaube, ich habe es verstanden, es scheint ein bisschen wie ein Trick zu sein, aber es funktioniert für meine Zwecke:

Ich verwende Storyboard:Ich habe einen UITableview-Controller mit UISearchBarDisplayController direkt darüber.Kein Code, einfach per Drag & Drop.

Von da an habe ich dieses Tutorial befolgt, damit die Suchleiste korrekt sucht http://clingingtoideas.blogspot.com/2010/02/uitableview-how-to-part-2-search.html

Allerdings PrepareForSegue:würde mich nur eine Zelle aus dem ursprünglichen Array anzeigen lassen, nicht mit dem Sucharray.

Also habe ich didSelectRowAtIndexPath verwendet:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (savedSearchTerm) {
    searchRowSelected = indexPath.row;  //<-- the trick that worked
    [self performSegueWithIdentifier:@"ShowDetail" sender:self];
}
}

searchRowSelected ist eine int-Variable, die ich oben in der Klasse deklariert habe.

didSelectRowAtIndexPath:wusste, welche Zeile ich auswählte, PrepareForSegue jedoch nicht.Deshalb brauchte ich diese Variable.

So habe ich es in PrepareForSegue verwendet:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if ([segue.identifier isEqualToString:@"ShowDetail"]) {

    dvc = [segue destinationViewController];

    NSIndexPath* path = [self.tableView indexPathForSelectedRow];
    int row = [path row];

    if (savedSearchTerm){   //set the detailViewController with the searched data cell 
        myDataClass* c = [searchResults objectAtIndex:searchRowSelected];
        dvc.myDataClass = c;
    }else{    //set the detailViewController with the original data cell
       myDataClass* c = [array objectAtIndex:row];
       dvc.myDataClass = c;
   }
}
}

Verwenden Sie diesen Code auch, um savedSearchTerm zu bereinigen

-(void) searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller{
    [self setSavedSearchTerm:nil];
}

Wenn jemand eine bessere Lösung hat, bin ich ganz Ohr :)

Andere Tipps

Hier ist die Lösung, die auf dem Kommentar von @James Chen basiert.Verwenden Sie auch einen anderen IndexPath, je nachdem, in welchem ​​Status sich die Tabelle befindet.

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{

    if ([[segue identifier] isEqualToString:@"toDetail"]) {

        Person *person = nil;

        if (self.searchDisplayController.active == YES) {
            NSIndexPath *indexPath = indexPath = [self.searchDisplayController.searchResultsTableView indexPathForSelectedRow];
            NSLog(@"segue - section: %d, row: %d", indexPath.section, indexPath.row);

            person = [self.filteredPersonArray objectAtIndex:indexPath.row];
        }
        else {
            NSIndexPath *indexPath = indexPath = [self.tableView indexPathForSelectedRow];
            NSLog(@"segue - section: %d, row: %d", indexPath.section, indexPath.row);

            person = [self.personArray objectAtIndex:indexPath.row];
        }

        [[segue destinationViewController] setPerson:person];   

    }
}

Ich habe Ihre Lösung ausprobiert und festgestellt, dass PrepeforseGe aufgrund des Lebenszyklus zweimal aufgerufen wird und ...-> performSegueWithIdentifier.

  1. self:prepareForSegue:Das Objekt auf dem Zielcontroller wird festgelegt (mit falschem Index), weil
  2. dest:viewDidLoad:Anschließend wird die Ziel-Controller-Ansicht geladen
  3. self:didSelectRow...:Der Index ist bekannt und richtig eingestellt.
  4. self:prepareForSegue:Das Objekt ist jetzt korrekt, hat aber keine Nebenwirkungen.

Ich habe mich dann auf didSelect konzentriert ...und habe mir diese Lösung ausgedacht, bei der ich den Übergang gelöscht und die Ansicht programmgesteuert verschoben habe:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    DestTableViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"DestViewController"];

    CustomObj *custObj = nil;

    if (tableView == self.searchDisplayController.searchResultsTableView) {
        custObj = [filteredListContent objectAtIndex:indexPath.row];
    } else {
        storeToDetail = [self.fetchedResultsController objectAtIndexPath:indexPath];
    }

    controller.custObj = custObj;

    [self.navigationController setNavigationBarHidden:NO];
    [self.navigationController pushViewController:controller animated:YES];
    // presentViewController::animated:completion is always full screen (see problem below)
}

Ich habe dann einige Probleme erlebt, zurückzukehren, weil ich einem Segue aus einem Mapview folge, was zu:

//DestinationViewController
- (IBAction)back:(id)sender
{
    [self.navigationController popToRootViewControllerAnimated:YES]; // list
    [self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; // map
}

Das ist nicht der richtige Weg, aber im Moment funktioniert es.

Der erste Teil ist jedoch einfach und sauber, und vielleicht funktioniert es auch für Sie?!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top