Подтвердить что ты не робот

IPhone: ошибка при использовании класса FPPopover при использовании его с UIBarButtonItem

Я использую класс FPPopover, который создает всплывающие окна для iPhone. Я выполнил точные шаги, которые находятся в файле readme, но вместо использования UIbutton из xib файла я использую UIBarButtonItem, созданный программно. Но я получаю следующую ошибку:

Завершение приложения из-за неперехваченного исключения "NSInvalidArgumentException", причина: '- [UIBarButtonItem superview]: непризнанный селектор, отправленный экземпляру 0x6a3e420'

Я скопировал тот же код, что и в файле readme, но я просто изменил okButton (UIButton *) с (id) отправителем (здесь здесь UIBarButtonItem *)

-(void)popover:(id)sender
{
    //the view controller you want to present as popover
    TestClass *controller = [[TestClass alloc] init];
    //our popover
    FPPopoverController *popover = [[FPPopoverController alloc] initWithViewController:controller];
    //the popover will be presented from the okButton view
    [popover presentPopoverFromView:sender];
    //release
    [controller release];
}

Я думал, может быть, это связано с UIBarButtonItem, который не является UIButton? Или это что-нибудь еще? Я попытался преобразовать UIBarButtonItem в UIButton, но все же дал мне ту же ошибку. Любые решения?

Еще одно замечание на всякий случай: так я программно создал навигационную панель вместе с кнопкой панели:

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


navItem.rightBarButtonItem = editButton;
4b9b3361

Ответ 1

currentPopoverFromView принимает только подкласс UIView. UIBarButtonItem не является подклассом UIView, поэтому вам нужно найти представление, связанное с этим элементом кнопки. Это решение, которое я использую с FPPopoverController

    UIBarButtonItem *buttonItem = sender;
    UIView* btnView = [buttonItem valueForKey:@"view"];
    //On these cases is better to specify the arrow direction
    [popover setArrowDirection:FPPopoverArrowDirectionUp];
    [popover presentPopoverFromView:btnView];

Это должно сработать! Дайте мне знать!

Ответ 2

Это b/c UIBarButtonItem наследует от UIBarItem и NSObject. Только элементы UI, которые наследуют от UIView, имеют свойства superview.

Ответ 3

Я получал ту же ошибку. Решение состоит в том, чтобы создать UIButton Programatically (в том же месте, что и элемент кнопки UIBar - установить соответствующие координаты), а затем представить popover из UIButton. Затем скройте UIButton.

Этот код работал у меня:

-(void)testMethod {

UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];

// set action as NULL if you dont need any method/functionality to call

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


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

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

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

//the popover will be presented from the Button view 
[popover presentPopoverFromView:button]; 

//hide the button
button.hidden = YES;

}

-(void)aMethod {
// Write any functionality if you need
}

Надеюсь, это поможет. Дайте мне знать, если у вас возникнут проблемы.

Ответ 4

В основном приложения отображают popover из BarButtonItem. FPPopOverController не поддерживает это. Итак, на мой взгляд, вы должны использовать: WYPopOverController