13 Stimmen

IPhone: Fehler beim Verwenden der FPPopover-Klasse, wenn sie mit einem UIBarButtonItem verwendet wird

Ich verwende die FPPopover-Klasse, die Popups für iPhones erstellt. Ich habe die genauen Schritte befolgt, die in der Readme-Datei stehen, aber anstatt ein UIButton aus einer xib-Datei zu verwenden, verwende ich ein UIBarButtonItem, das programmgesteuert erstellt wird. Aber ich bekomme den folgenden Fehler:

Beenden der App aufgrund einer unbehandelten Ausnahme 'NSInvalidArgumentException', Grund: '-[UIBarButtonItem superview]: nicht erkannter Selektor, der an die Instanz 0x6a3e420 gesendet wird'

Ich habe den gleichen Code wie in der Readme-Datei kopiert und eingefügt, aber ich habe (UIButton*)okButton durch (id)sender ersetzt (das id hier ist UIBarButtonItem*)

-(void)popover:(id)sender
{
    //Die Ansichts-Controller, den du als Popover präsentieren möchtest
    TestClass *controller = [[TestClass alloc] init];
    //Unser Popover
    FPPopoverController *popover = [[FPPopoverController alloc] initWithViewController:controller];
    //Der Popover wird von der Ansicht von okButton präsentiert
    [popover presentPopoverFromView:sender];
    //Release
    [controller release];
}

Ich dachte vielleicht hat es etwas mit dem UIBarButtonItem zu tun, das kein UIButton ist? Oder ist es etwas anderes? Ich habe versucht, das UIBarButtonItem in UIButton umzuwandeln, hat aber immer noch den gleichen Fehler gegeben. Gibt es Lösungen dafür?

Noch eine Anmerkung, nur für den Fall: So habe ich programmgesteuert die Navigationsleiste zusammen mit der Leisten-Schaltfläche erstellt:

UINavigationBar *navBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(320, 0, 320, 44)];
UINavigationItem *navItem = [[UINavigationItem alloc] initWithTitle:@"Nach Vereinen"];
[navBar pushNavigationItem:navItem animated:NO];
UIBarButtonItem *editButton = [[UIBarButtonItem alloc] initWithTitle:@"Filter"
                                               style:UIBarButtonItemStyleBordered
                                              target:self
                                              action:@selector(popover:)];

navItem.rightBarButtonItem = editButton;

24voto

Alvise Susmel Punkte 569

Der presentPopoverFromView akzeptiert nur eine UIView-Unterklasse. UIBarButtonItem ist keine Unterklasse von UIView, daher müssen Sie die Ansicht finden, die mit diesem Schaltflächenobjekt verbunden ist. Dies ist die Lösung, die ich mit FPPopoverController verwende

    UIBarButtonItem *buttonItem = sender;
    UIView* btnView = [buttonItem valueForKey:@"view"];
    //In diesen Fällen ist es besser, die Pfeilrichtung anzugeben
    [popover setArrowDirection:FPPopoverArrowDirectionUp];
    [popover presentPopoverFromView:btnView];

Das sollte funktionieren! Lass es mich wissen!

2voto

Cyprian Punkte 9323

Dies liegt daran, dass UIBarButtonItem von UIBarItem und NSObject erbt. Nur UI-Elemente, die von UIView erben, haben superview Eigenschaften.

1voto

user1140780 Punkte 978

Ich habe den gleichen Fehler bekommen. Die Lösung besteht darin, ein UIButton programmatisch zu erstellen (am selben Ort wie das UIBar-Element - setzen Sie die entsprechenden Koordinaten) und dann das Popover vom UIButton aus zu präsentieren. Dann den UIButton ausblenden.

Dieser Code hat bei mir funktioniert:

-(void)testMethod {

UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];

// setzen Sie die Aktion als NULL, wenn Sie keine Methode/Funktionalität aufrufen möchten

[button addTarget:self action:@selector(aMethod)
 forControlEvents:UIControlEventTouchDown];

[button setTitle:@"View anzeigen" forState:UIControlStateNormal];
button.frame = CGRectMake(130, -40, 160.0, 40.0);
[self.view addSubview:button];

AlertsViewController *controller = [[AlertsViewController alloc] init]; 

// unser Popover
FPPopoverController *popover = [[FPPopoverController alloc] initWithViewController:controller]; 

// Das Popover wird vom Button-Element aus präsentiert
[popover presentPopoverFromView:button]; 

// den Button ausblenden
button.hidden = YES;

}

-(void)aMethod {
// Schreiben Sie eine beliebige Funktionalität, falls erforderlich
}

Hoffe, das hilft. Lass mich wissen, wenn es Probleme gibt.

0voto

Asif Bilal Punkte 4209

Meistens zeigt die Anwendung ein Popover von BarButtonItem an. FPPopOverController unterstützt dies nicht. Daher sollten Sie meiner Meinung nach WYPopOverController verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X