• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

UIBarButton programmatisch im ABPeoplePickerNavigationController einbinden

bginner

Ingrid Marie
Registriert
13.12.09
Beiträge
266
Hallo zusammen,

ja der Titel sagt es schon, ich möchte gerne einen UIBarButton in diesen ABPeoplePickerNavigationController einbinden.
Der kann ja auch alles was ein normaler UINavigationController kann. Aber ich bekomme es nicht gebacken ihm ein
Code:
leftBarButtonItem
zuzuweisen, bzw. zur Anzeige zu bringen.
Ich habe folgenden Code.

Code:
- (IBAction)showPicker
{
  ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
  picker.peoplePickerDelegate = self;
  if (sortButton)
  {
    NSLog(@"We have one");
  }
  else
    NSLog(@"We do not have one");

  picker.navigationItem.leftBarButtonItem = sortButton;  //sortButton ist in ViewDidLoad definiert
  NSLog(@"Items: %@", picker.navigationItem.leftBarButtonItems); //Speicheradresse wird anzegeigt
  for (id object in picker.navigationItem.leftBarButtonItems)
  {
    if ([object isKindOfClass:[UIBarButtonItem class]])
      {
          UIBarButtonItem *button = (UIBarButtonItem *)object;
          NSLog(@"Title: %@", button.title);  //Titel wird korrekt angezeigt
      }
  }
  [self presentViewController:picker animated:YES completion:nil];
}

Der UIBarButtonItem wird also nicht angezeigt.
Komischerweise existiert er aber.
Ich frage ja sogar den NavigationController wieviele Items er hat und er gibt mir auch meins zurück was ich definiert habe und sagt "JA" so eins habe ich, aber er zeigt es nicht an. Ich weiß ja das es angelegt wurde und existiert.
Ich lasse mir auch den Titel ausgeben das klappt auch...nur der BarButton selber wird nicht angezeigt.

In ViewDidLoad habe ich den UIBarButton so definiert:
Code:
sortButton = [[UIBarButtonItem alloc] initWithTitle:@"Sortieren" style:UIBarButtonItemStyleDone target:self action:@selector(add)];

Was mache ich falsch? Verhält sich der ABPeoplePickerNavigationController doch etwas anders als ein normaler NavigationController?
 
Zuletzt bearbeitet:

lx88

Stina Lohmann
Registriert
02.09.09
Beiträge
1.027

bginner

Ingrid Marie
Registriert
13.12.09
Beiträge
266
OK, danke schonmal. Nur mal zum Verständniss.... das der ABPeoplePickerNavigationController kein Subclassing unterstützt heißt doch, dass ich keine eigene Klasse erstellen kann, die von diesem ABPeoplePickerNavigationController erbt, richtig?
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Was mache ich falsch? Verhält sich der ABPeoplePickerNavigationController doch etwas anders als ein normaler NavigationController?
Nein, ABPeoplePickerNavigationController ist eine Subklasse von UINavigationController und verhält sich daher auch nicht anders. Auch ein UINavigationController würde dir so einen leftBarButtonItem anzeigen.

picker.navigationItem.leftBarButtonItem = sortButton; //sortButton ist in ViewDidLoad definiert
Du benutzt das falsche navigationItem. Du musst das navigationItem vom topViewController verwenden:

picker.topViewController.navigationItem.leftBarButtonItem = sortButton;
 

bginner

Ingrid Marie
Registriert
13.12.09
Beiträge
266
Ich hab schon wieder mit dem tollen ABPeoplePickerNavigationcontroller Probleme. Diese Picker zeigt ja alle Personen in einer Liste (TableView) an und ich möchte nun Einfluss auf die Rows nehmen, aber ich komme nicht ran. Dieser NavigationController hat als TopViewController eine Art TableView, genauer gesagt ist es ein ABMembersViewController. Diese Klasse findet man nicht in der Doku leitet sich aber von der Urklasse UITableViewController ab, das habe ich geprüft. Wenn ich diese ABMembersViewController als ein UITableViewController caste und mir dann die visibleRows anzeigen lasse kommt NULL raus. Dann könnt eman meinen ich bin auf dem falschen Controller aber daskann gar nicht sein. Hier mein Code

Code:
- (IBAction)showPicker
{
  picker = [[ABPeoplePickerNavigationController alloc] init];
  picker.peoplePickerDelegate = self;
  
  NSLog(@"View: %@", picker.visibleViewController);
  NSLog(@"View: %@", [[[picker.viewControllers objectAtIndex:0] superclass] superclass]); // Ausgabe: UITableViewController
  
  
  UITableViewController *tvc = (UITableViewController *)picker.visibleViewController;
  NSLog(@"Rows: %@", [tvc.tableView visibleCells]); // Gibt NULL aus
  
  picker.topViewController.navigationItem.leftBarButtonItem = sortButton;
  
  [self presentViewController:picker animated:YES completion:nil];
}

Was mache ich falsch?
 

MacApple

Schöner von Bath
Registriert
05.01.04
Beiträge
3.652
Du erstellst einen neuen ABPeoplePickerNavigationController, zeigst diesen am Ende der Methode erst an und erwartest, dass vorher schon irgendwas "visible" ist?
 

bginner

Ingrid Marie
Registriert
13.12.09
Beiträge
266
Sichtbar ist auf jeden Fall der ABMenbersViewController. Das sagt mir das Log wenn ich "picker.visibleViewController" aufrufe. Nur die Rows fehlen eben. aber stimmt die können nicht sichtbar sein. Aber ich habe auch schon ausprobiert mir die "numberofSections" oder die "numberOfRowsInSection" anzuzeigen ich erhalte immer 0 (Nicht NULL). Woran liegt das?
 

frostdiver

Zwiebelapfel
Registriert
19.06.12
Beiträge
1.285
"numberOfSections..." liefert ja auch einen NSInteger zurück. Also 0.
Das Ding ist halt noch nicht aufgebaut. Solange du ihn nicht präsentierst, passiert da nicht viel.
Probier es doch mal so:
Code:
[self presentViewController:picker animated:YES completion:^{NSLog(@"Rows Complete: %@", [tvc.tableView visibleCells]);}];

Insgesamt sieht mir das Ganze aber nach einem Holzweg aus ... ohne zu wissen, wo du hin willst.
 

bginner

Ingrid Marie
Registriert
13.12.09
Beiträge
266
Das sieht sehr gut aus. Leider kennt der Compiler tvc nicht mehr wenn es innerhalb eines Blocks steht. Es gibt doch irgendwie die Möglichkeit ein Block-Attribut daraus zu machen oder? Ich hab schonmal versucht "__block" davor zu schreiben aber das geht auch nicht. Wie bringe ich es dem Compiler bei das er tvc auch innerhaln eines Blocks kennt?

Edit: Kommando zurück, mein Fehler.
Mit dieser Methode geht es tatsächlich, vielen Dank, dann komme ich jetzt erstmal weiter.
 
Zuletzt bearbeitet:

bginner

Ingrid Marie
Registriert
13.12.09
Beiträge
266
Hallo nochmal,

ich hänge schon wieder fest. Mit diesem ABPeoplePicker komm ich irgendwie nicht klar.
Da ich jetzt dank euch Zugriff auf die Zellen habe, möchte ich nun Subviews (Labels) zu den Zellen hinzufügen.
Aber das klappt nur bedingt. Ich hab drei verschiedene Methoden ausprobiert und alle liefern dasselbe sclechte ergebniss.
Ich bin irgendwie nur in der Lage die letzte Zelle zu manipulieren.
Ich habe folgenden Code:
Code:
- (IBAction)showPicker
{
  picker = [[ABPeoplePickerNavigationController alloc] init];
  picker.peoplePickerDelegate = self;
  
  NSLog(@"View: %@", picker.visibleViewController);
  NSLog(@"View: %@", [[[picker.viewControllers objectAtIndex:0] superclass] superclass]);
  
  
  UITableViewController *tvc = (UITableViewController *)picker.visibleViewController;
  
  picker.topViewController.navigationItem.leftBarButtonItem = addButton;

  [self presentViewController:picker animated:YES completion:^{
  
  UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(250, 20, 100, 30)];
  label.text = @"Test";
  label.textColor = [UIColor lightGrayColor];
  [label setFont:[UIFont fontWithName:@"Helvetica" size:11.0]];
  
  for (UITableViewCell *cell in [tvc.tableView visibleCells])
  {
  NSLog(@"cell: %@",cell);  //Gibt die korrekte Zelle aus
  NSLog(@"cell.textLabel.text: %@",cell.textLabel.text); // Ist komischerweise NULL
  [cell addSubview:label]; //Subview wird nur zur letzten Zelle hinzugefügt
  }
  }];
}

Ich habe ingesamt 4 Zellen also Eitrage im der Tabelle aber der Label wird nur in der Letzten Zelle angezeigt. Woran kann das liegen? Was mache ich jetzt schon wieder falsch?

EDIT: Selbst wenn ich den Label statisch jeder Zelle zuweise, wird im Endeffekt nur einer angezeigt und zwar immer nur der letzte, den ich zugewiesen habe.
 

frostdiver

Zwiebelapfel
Registriert
19.06.12
Beiträge
1.285
Ein View kann nur einmal in der View-Hierarchie existieren. Du müsstest also neue Label erstellen.

Ich weiß nicht wie weit man dieses Hacking noch treiben kann (es sind ja keine Zellen von allen Datensätzen vorhanden, die Zellen werden ja wieder benutzt usw). Grundsätzlich wäre ein eigener PeoplePicker sinnvoller.
 

bginner

Ingrid Marie
Registriert
13.12.09
Beiträge
266
Stimmt natürlich, momentan schein ich irgendwie blind zu sein. Einmal die Label-erstellung in die Schleife kopiert und schon funzt alles. Ich bin selber gespannt in wie weit sich der PeoplePicker modifizieren lässt. Ich will ja gucken ob ich nicht durch modifikation mir was eigenes bauen kann. Man kann nämlich noch ganz andere Dinge auslesen als nur Name oder Telefonnummer.