2011-10-16 17 views
20

To może nie być możliwe, ale mam nadzieję, że ktoś będzie miał pomysł, jak to zrobić.Przycisk tworzenia widoku popover anchor w czasie wykonywania

Mam aplikację, którą przesyłam z iPhone'a tylko do Universal. Na iPhonie używam aplikacji z kartami. Używam trzech zakładek, aby wyświetlić normalne dane. Mam kartę czwartą, która jest wyświetlana tylko wtedy, gdy spełnione są określone warunki. Aby dodać zakładkę, robię:

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) 
{ 
    UITabBarController *tabController = (UITabBarController *) self.rootViewController; 
    NSMutableArray* newArray = [NSMutableArray arrayWithArray: tabController.viewControllers]; 
    [newArray addObject: [theStoryboard instantiateViewControllerWithIdentifier: @"AdditionalView-Phone"]]; 
    [tabController setViewControllers:newArray animated:YES]; 
} 

dla iPad, mam wystarczająco dużo miejsca na początkowym celu wyświetlenia wszystko z trzech głównych kartach iPhone UI. Potrzebuję tylko jednego dodatkowego (małego) widoku dla "dodatkowych" danych. Chciałem to zrobić za pomocą widoku popOver, więc ustawiłem początkowy widok za pomocą paska nawigacji i przycisku popover, jak w szablonie aplikacji narzędziowej. Ale teraz utknąłem. Nie mogę wymyślić, jak utworzyć ten przycisk popover w czasie wykonywania i sprawić, że zrobi to poprawnie przejście do widoku popOver. Mogę dodać przycisk tak:

UIBarButtonItem *flipButton = [[UIBarButtonItem alloc] initWithTitle: @"Modem" style: UIBarButtonItemStylePlain target: self action: @selector(togglePopover:)]; 
self.navBar.topItem.rightBarButtonItem = flipButton; 

ale otrzymuję wyjątek: „NSInternalInconsistencyException”, powód: „UIStoryboardPopoverSegue muszą być przedstawione z pozycji przycisk paska lub widokiem” Jestem prawie pewien, że to dlatego, że nie mam zestawu kotwicy do segregacji popOver. Przycisk nie istnieje w scenorysie, więc nie mogę go tam ustawić. I nie mogę znaleźć interfejsu API do ustawienia go w czasie wykonywania.

Próbowałem również utworzyć przycisk w IB, ale nie w hierarchii widoku, a następnie wystarczy ustawić właściwość rightBarButtonItem na istniejący przycisk. To też działa, ale nadal nie mogę ustawić tego przycisku jako kotwicy dla widoku popover. Mogę ustawić pasek nawigacji jako kotwicę, ale to sprawia, że ​​zakotwicza się w tytule na pasku nawigacji, który wygląda głupio.

Wszelkie pomysły?

+0

Hej @ Flyingdiver znalazłeś rozwiązanie tego? – Rog

+0

Tak, utwórz ukryty UIView, z którego możesz pokazać popover i przenieść go tam, gdzie chcesz. –

Odpowiedz

13

Miałem ten sam problem i rozwiązałem go, tworząc UIBarButtonItem w Storyboard dla kontrolera widoku, ale nie będącego częścią hierarchii widoku.

W IB, przeciągnij element przycisku paska do ciemnego paska poniżej widoku kontrolera widoku, upuść go obok ikon "First Responder" i "View Controller". Stwórz dla niego (mocny) IBOutlet. Następnie utwórz z niego popover do kontrolera docelowego, przeciągając od elementu przycisku paska do miejsca docelowego. Wygląda na to, że jest to jedyny sposób, aby ustawić go jako kotwicę. Wybranie go jako kotwicy dla istniejącego segue nie działa (wygląda na IB).

enter image description here

W viewDidLoad można przypisać ten pasek przycisków element do navigationItem (lub gdziekolwiek chcesz) i segue działa zgodnie z oczekiwaniami.

3

Ciekawi mnie również to, więc zrobiłem szybki testowy projekt. Masz rację, nie ma sposobu, aby skonfigurować popover w środowisku wykonawczym lub dodać punkt kontrolny do przycisku, który nie znajduje się w hierarchii widoku przy użyciu Kreatora interfejsu.

Moje rozwiązanie było ustawić wszystko w IB z UIBarButtonItem widzialnego i podłączonym do mienia IBOutlet, a następnie usunąć go z paska nawigacyjnego w -viewDidLoad:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.navigationItem.rightBarButtonItem = nil; 
} 

Potem wystarczy dodać go lub usunąć dotykając innego przycisku:

- (IBAction)toggleBarButtonItem:(id)sender 
{ 
    UIBarButtonItem *item = (self.navigationItem.rightBarButtonItem == nil) ? self.popoverBarButtonItem : nil; 
    [self.navigationItem setRightBarButtonItem:item animated:YES]; 
} 

można warunkowo zachować lub usunąć przycisk w -viewDidLoad ten sam sposób. Segue pozostaje zakotwiczone do UIBarButtonItem.

2

Nie jestem pewien, czy to jest dokładnie to, czego chcesz, ale to właśnie zrobiłbym. Stwórz przycisk i ustaw go za pomocą jakiegoś celu/działania. Zadzwoń że metoda cel/działanie

presentPopover:(UIButton *)sender; 

Następnie w metodzie presentPopover, powiedzmy

UIViewController *customAdditionalViewController = [[MySpecialVC alloc] init]; 
//Configure the customAdditionalViewController 
//Present the customAdditionalViewController in a Popover 
UIPopoverController *popover = [[UIPopoverController alloc] initWithViewController:customAdditionalViewController]; 
//Set popover configurations 
[popover presentPopoverFromRect:sender.frame inView:self.view permittedArrowDirections:/*whatever you want*/ animated:YES]; 

To jak bym sobie sprawę użycia.

3

będę spróbuj obojętne pogląd, że jest to rozmiar i kształt poglądów chcę przedstawić popover z, drutu, że do celu segue popover, a następnie przesunąć widok do odpowiedniej pozycji w prepareForSegue:sender:

+0

To działa! Widok ukrytego obrazu również nie sprawia problemów. –

Powiązane problemy