Tego samego dnia miałem do czynienia z tym samym problemem, kilka obejść (w tym przedstawienie popover w staroświecki sposób).
Dla tego przykładu, mam obiekt, który jest przechowywany w mojej klasie komórek niestandardowych. Po wybraniu komórki wywołuję taką funkcję, aby otworzyć szczegóły w obiekcie popOverViewController dotyczącym obiektu i wskazać (zakotwiczenie) odpowiednią komórkę w tabeli.
- (void)openCustomPopOverForIndexPath:(NSIndexPath *)indexPath{
CustomViewController* customView = [[self storyboard] instantiateViewControllerWithIdentifier:@"CustomViewController"];
self.myPopOver = [[UIPopoverController alloc]
initWithContentViewController:customView];
self.myPopOver.delegate = self;
//Get the cell from your table that presents the popover
MyCell *myCell = (MyCell*)[self.tableView cellForRowAtIndexPath:indexPath];
CGRect displayFrom = CGRectMake(myCell.frame.origin.x + myCell.frame.size.width, myCell.center.y + self.tableView.frame.origin.y - self.tableView.contentOffset.y, 1, 1);
[self.myPopOver presentPopoverFromRect:displayFrom
inView:self.view permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];
}
Problem z tą metodą polega na tym, że często potrzebujemy widoku popover, aby mieć niestandardowy inicjator. Jest to problematyczne, jeśli chcesz, aby Twój widok był projektowany w storyboardach zamiast w xib i mieć niestandardową metodę init, która przenosi obiekt powiązany z komórką jako parametr do użycia na jego wyświetlaczu. Nie możesz też użyć popover (na pierwszy rzut oka), ponieważ potrzebujesz dynamicznego punktu kontrolnego (i nie możesz zakotwiczyć w prototypie komórki). Oto co zrobiłem:
- Najpierw utwórz ukryty UIButton 1px X 1px w widoku kontrolerów widoku. (ważne, aby podać ograniczenia przycisków, które pozwolą na przeniesienie go w dowolne miejsce w widoku).
- Następnie zrób ujście dla przycisku (nazwałem mój popOverAnchorButton) w twoim kontroler widoku i przeciągnij przejście z ukrytego przycisku do zobacz kontroler, do którego chcesz przejść. Zrób z tego popover.
Teraz masz popover z "legalną" kotwicą. Przycisk jest ukryty, więc nikt nie może tego dotknąć przypadkowo. Używasz tego tylko do punktu kontrolnego.
Teraz po prostu wywołaj swoją segue ręcznie w funkcji podobnej do tej.
- (void)openCustomPopOverForIndexPath:(NSIndexPath *)indexPath{
//Get the cell from your table that presents the popover
MyCell *myCell = (MyCell*)[self.tableView cellForRowAtIndexPath:indexPath];
//Make the rect you want the popover to point at.
CGRect displayFrom = CGRectMake(myCell.frame.origin.x + myCell.frame.size.width, myCell.center.y + self.tableView.frame.origin.y - self.tableView.contentOffset.y, 1, 1);
//Now move your anchor button to this location (again, make sure you made your constraints allow this)
self.popOverAnchorButton.frame = displayFrom;
[self performSegueWithIdentifier:@"CustomPopoverSegue" sender:myCell];
}
I ...... Voila. Teraz używasz magii segues z całą swoją świetnością i masz dynamiczny punkt zakotwiczenia, który wydaje się wskazywać na twoją komórkę. teraz w -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
możesz po prostu rzucić nadawcę do klasy twojej komórki (biorąc pod uwagę, że robisz odpowiednie kontrole nad typem nadawcy i który fragment jest wywoływany) i przekazujesz obiekt docelowy segue do kontrolera obiektu komórki.
Daj mi znać, jeśli to pomoże, lub ktoś ma jakieś uwagi lub ulepszenia.
Ponadto, jeśli to pomaga. Jeśli mógłbyś oddać głos na głos. Jestem nowym użytkownikiem i muszę zarabiać pieniądze na robienie czegokolwiek. – johnrechd
Czy wiesz, czy Xcode 5/iOS 7 poprawił coś w tym obszarze? W każdym razie świetne obejście. – neural5torm
Nie jestem jeszcze pewien, chociaż nie sądzę. Aktualizuję aplikację, która używa tego w przyszłym tygodniu na iOS7 i zaktualizuje się w razie potrzeby. – johnrechd