1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Unsere jährliche Weihnachts-Banner-Aktion hat begonnen! Wir freuen uns auf viele, viele kreative Vorschläge.
    Mehr dazu könnt Ihr hier nachlesen: Weihnachtsbanner 2016

    Information ausblenden

UISearchBar-Problem mit UIViewControllern

Dieses Thema im Forum "iOS-Developer" wurde erstellt von nelfisch, 28.01.10.

  1. nelfisch

    nelfisch Carola

    Dabei seit:
    15.03.08
    Beiträge:
    108
    Hallo Leute,
    hej Leute,

    ich Habe folgendes Problem: ich habe eine App. Geschrieben und einen Button hinzugefügt, der bei Touch auf sich selbst einen neuen uiviewcontroller zu initialisieren, der in seinem View eine uisearchbar und ein uitableview enthalt. Die Data source des tableviews ist korrekt gesetzt, ein nsarray, und die Suche funktioniert auch so weit, also er zeigt nur die objekte anzeigt, in meinem Fall strings, die der Eingabe im uisearchbar entspricht. Diese strings sind BTW die .title von anderen uiviecontrollern...
    Nun zu meinem eigentlichen Problem: ich wurde das ganze gerne so implementieren, dass man, wenn man auf eine Zelle des Search-tables klickt, dann ein uiviewcontroller aufgerufen wird, der dem geklickten Eintrag entspricht... Nicht verstanden? Ok, ich werde euch ein Beispiel geben: der user hat einen suchbegriff eingegeben und der Inhalt des Tableviewd besteht jetzt nur noch aus zwei eintragen. Der user klickt auf einen Eintrag und soll dann zu dem dazu gehörigen uiviewcontroller samt View kommen. Der zusammenhang ist, dass der Name des views vom aufzurufenden uiviewcontroller, den ich in der Initialisierung gesetzt habe über Self.title =...; gesetzt habe, dem Text der Zellen in dem tableview der uisearchbar entspricht...
    Ich habe ein bisschen mir was selbst überlegt, war auf die Idee mit dem Tag der Zellen über ein zweites ,,symetrisches,, Array, aber irgendwie komme ich mit meiner eigenen gedankenleistung auf keinen grünen Zweig...
    Ware also sehr dankbar für Tips eurerseits ;) danke schon mal!
    Nelfisch

    p.s.:sry für die komische Rechtschreibung, habe das von meinem iPod geschrieben^^
     
  2. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    07.01.07
    Beiträge:
    432
    Du willst wahrscheinlich einfach das entsprechende Objekt für die vom User ausgewählte Zeile rausfinden. Dazu gibts die Methode 'indexPathForSelectedRow', welche dir einen NSIndexPath zurückgibt. Somit hast du die ausgewählte Zeile und erhälst mit 'objectAtIndex:' den Titel deines UIViewController. Jetzt musst du den finden und anzeigen lassen.

    Apple Documentation:
    - 'indexPathForSelectedRow' in UITableView Class Reference
    - NSIndexPath Class Reference

    Gruss ppocket

    PS: Ich kenne das iPhone SDK eigentlich nicht, aber wahrscheinlich musst du die Zeile etwa so auslesen:

    Code:
    int row = [myIndexPath indexAtPosition:1];
    
     
  3. nelfisch

    nelfisch Carola

    Dabei seit:
    15.03.08
    Beiträge:
    108
    Hej,

    ja, also so ist nicht, habe schon selber ja ein bisschen rumprobiert, auch mit dem indexPath, da der ja sogar schon in der doku mit drin ist, aber das klappt nicht so richtig. habe mir die indexPath´s einfach mal ausgeben lassen, per NSLog, und dann kam bei raus, das die verwertbaren infos lediglich daraus bestehen, dass da drin steht, in welcher section und in welcher row sich die selektierte Zelle befindet. Hilft mir erst mal nicht. Ich werde einfach noch mal versuchen, dir ein Beispiel zu geben:
    Stell dir eine App vor, in der gaaaaaaaanz viele Büchertitel aufgelistet sind. Nun klickst du auf die Such-Leiste und kannst das ganze nach Autoren durchsuchen lassen. Du suchst also z.B.: Nach J.R.R. Tolkien und dann stehen im Table-View vom Search nur noch bücher mit Titeln von dem, also sagen wir mal Herr der Ringe 1-3 und noch 2 andere. Wenn du jetzt auf einen der Einträge klickst, solltest du im optimalen Falle zu einem, vorher von mir schln layouteten und inhaltlich befüllten, View eines UIViewControllers über genau dieses Buch kommen...Wie macht man das also? Oder geht das überhaupt, oder muss ich einfach nen switch für die Reihe in meinem Titel index machen? Das ist mir aber irgendwie zu viel arbeit...:D
    danke schon mal
    nelfisch

    p.s.: in Wahrheit ist es sogar noch etwas einfacherer, weil ich, als Programmierer schon am cell.text genau sehen kann, welcher ViewController dann aufgerufen werden soll, der self.title des UIViewControllers stimmt jedoch in der Regel nicht mit dem Namen in XCode(also .... . h oder ... .m) überein...kompliziert irgendwie^^

    könnte man das evt. so machen? man definiert jetzt halt vorher halt noch die eigenschaft NSString* arrayName; , in der man dann in der Implementierung den String speichert, den man auch in dem Such-Array hat?
    Code:
    .... self.title = @"..."; //(self.title != ...... .h)
    self.arrayName = @"...";
    und dann den aufruf des Controllers irgendwie:
    Code:
    .../auslesen des cell.text´es und speichern in NSString* myString;
    [myString]* myViewController = [[myString alloc] initWithNibName: ... bundle: ...];
    [self.navigationController pushViewController:myViewController animated:...];
    ? *würde mich wundern wenn das gehen würde^^*
     
  4. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    07.01.07
    Beiträge:
    432
    Du zeugst wirklich von grosser Kreativität - gut so! Nur ist mir das irgendwie ein Wenig zu kreativ. Für was diesen Array-Namen?

    Am Einfachsten wählst du als nib-Namen genau die Anzeigetitel, welche im UITableView angezeigt werden. Dann kannst du immer genau den Text der Zelle verwenden, um das richtige nib zu laden.

    Ich persönlich würde dein Problem wahrscheinlich so lösen:

    Ich wähle als dataSource nicht ein NSArray, sondern ein NSDictionary. Die Keys in meinen Dictionary sind dann die Anzeigenamen und die Values die zugehörigen nib-Namen. Die Tabelle füllst du dann mit diesem Array:

    Code:
    tableValues = [myDictionary allKeys];
    
    Dabei musst du beachten, dass die keys in einem Dictionary ungeordnet sind, also rein zufällig geordnet ausgegeben werden. Sortiere das tableValues-Array also irgendwie. Bei Strings zB. mit:

    Code:
    sortedArray = [tableValues sortedArrayUsingSelector:@selector(compare:)];
    
    So hast du das nib immer ganz einfach so:

    Code:
    nibName = [myDictionary objectForKey:selectedCell.text];
    
    aber das ist auch nur eine Idee, welche ich jedoch einfach genug finde. Programmieren ist halt manchmal kompliziert! :)

    Gruss ppocket
     
  5. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    07.01.07
    Beiträge:
    432
    Ich will jetzt nicht nochmal in der iPhone SDK nachsehen, aber NSCell (Cocoa Mac OS X) unterstützt Folgendes:

    Die NSCell kann ein Objekt als representedObject aufnehmen. Vielleicht kannst du dort immer schön den nib-Namen als String speichern und dann bei der selection auslesen. Such in der iPhone SDK danach... vielleicht hast du ja Glück! :)

    Gruss ppocket
     
  6. nelfisch

    nelfisch Carola

    Dabei seit:
    15.03.08
    Beiträge:
    108
    :D

    nicht schlecht, da hast du meine idee echt konsequent zu ende gedacht, das mit den tags. Gut so, für so was ist ein Forum da....Also an sich ist die Idee einfach nur genial, wie ich finde, nur ein Problem habe ich leider noch. Ich habe zig(also echt vieeeele...) UIViewController, die jeder eigentlich mehr oder weniger einzigartig sind. Diese einzigartigkeit besteht zum einem aus dem
    Code:
     self.title = @"...";
    und zum anderen daraus, das jeder ein
    Code:
    IBOutlet UIScrollView* sView;
    hat. In der viewDidLoad-Methode des jeweiligen Controllers habe ich dann die property
    Code:
     sView.contentSize = CGSizeMake(280,...); 
    gesetzt, das „...", also die height ist bei jedem ViewController anders, und da genau sehe ich noch irgendwie das Problem.

    Mhm, ich werde das wahrscheinlich nicht so machen können, das die texte der zellen in dem Search-TableView genau den Namen der nib-Dateien entsprechen, da ich in diesen Namen einfach mal Umlaute und Sonderzeichen weggelassen habe (ja, ich finde, dass Texte in einem TableView deutlich besser MIT Leerzeichen aussehen :)). Frage: Wie sortiere ich NSDictionarys? Könnte jetzt zu meinem Bücherregal rennen, und dann mein fettes, echt fettes Objective-C Buch rauskramen, aber das dauert glaube ich ne Weile...mal gucken, vielleicht finde ich es ja auch selber...
    Aber danke schon mal!

    p.s.:Wenn ich schon mal beim fragen bin: Weiß jemand, was so die Kriterien für Apple sind, was NICHT für den App-Store zuzulassen? Dann könnte ich gleich versuchen sowas zu vermeiden...:D
     
  7. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    07.01.07
    Beiträge:
    432
    Schau dir den letzten Post von mir noch an, den hast du anscheinend noch nicht gesehen. Der sollte genau das Problem mit den Umlauten beheben.

    Dictionaries kannst du nicht sortieren, hätte ja auch keinen Sinn, da sie ja nur einen Key mit einem Wert verbinden. Die Keys kannst du aber sortieren. Zum einen nach oben beschriebenem Weg. Da hast du aber die Keys selber sortiert.

    'keysSortedByValueUsingSelector:' (NSDictionary -> Dictionaries and Collections)

    Die sortiert dir die Keys nach den Values.

    Gruss ppocket

    PS: Wieso den dein dickes Obj-C Buch, wenns doch ADC gibt... gerade für einzelne Methoden von Klassen ist die besser und schneller. Ich hoffe, du weisst, wo du sie in Xcode findest! :)
     
  8. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    07.01.07
    Beiträge:
    432
    Zum UIViewController:

    Mach eine Subklasse davon, welche folgende properties mitführt:

    title
    contentHeight

    Dann kannst du Instanzen dieser Subklasse erstellen, das nib setzen und den Titel und die Höhe einstellen. Im CGSizeMake setzt du dann die Instanzvariable für die Höhe ein. Fertig!

    Gruss ppocket
     
  9. nelfisch

    nelfisch Carola

    Dabei seit:
    15.03.08
    Beiträge:
    108
    Wow, es klappt echt, die Idee ist einfach genial, echt :thums up: dafür....
    ein Problem habe ich aber trotzdem noch: Ich bin mittlerweile mit dem erstellen des Dictionarys fertig, also soweit "abgeschrieben"(also nib-Namen und so), aber jetzt muss ich noch irgendwie an den Text der Zelle, die geklickt wird kommen, um damit den ViewController laden zu können( ich brauche den cell.text ja zum einen als „Überschrift" und zum anderen auch als Key für mein Dictionary um an den nib-Namen zu kommen...)

    viele probleme, aber sie sind dank dir ja schon erheblich geschrumpft :D
    nelfisch

    p.s.: so habe ich es im moment, das funktioniert nicht, da sagt er das cell.text not defined ist....:
    Code:
    GeneralViewController* grav = [[GeneralViewController alloc] initWithTitle:[NSString stringWithFormat:@"%@",[cell.text]] nibTitle:[listContent objectForKey:[NSString stringWithFormat:@"%@",[cell.text]]] height:[NSNumber numberWithFloat:600]];
    mir fällt grade auf, ich muss dann ja auch noch irgendwie die Größe, also bei mir die height: übergeben bekommen, die ist ja auch bei jedem unterschiedlich...mal gucken, erst mal den UIViewController generell auf den Schirm bekommen....;)
     
  10. nelfisch

    nelfisch Carola

    Dabei seit:
    15.03.08
    Beiträge:
    108
    sooo...
    also, das mit dem aufrufen des ViewControllers habe ich hinbekommen, ist auch der richtige, der Tip mit dem Dictionary war der richtige, habe einfach noch ein "paralleles" array mitlaufen lassen und das dann über [indexpath row] gemacht. jetzt ist nur noch ein einziges Problem: das mit den contentheight zahlen, die ich dem Controller bei der Initialisierung mitgeben muss...ich glaube ich mache da einfach noch ein zweites Dichtionary, das als key wieder den cell.text enthält und als value diesmal keinen String sondern einfach ein Objekt von NSNumber, ist zwar etwas Tipp-Arbeit, aber ich werde das schon hinkriegen, da bin ich zuversichtlich....:D
    Oder habt ihr/du(wohl eher^^) noch ne effizientere möglichkeit?
    nelfisch
     
  11. Poljpocket

    Poljpocket Salvatico di Campascio

    Dabei seit:
    07.01.07
    Beiträge:
    432
    Nein, das wird die Beste sein...

    Gruss ppocket
     

Diese Seite empfehlen