Как отображать popware программно из uibutton, который также создается программно (не используя конструктор интерфейса)
У меня есть кнопка, которую я создал программным способом в контроллере представления. После нажатия кнопки я хочу, чтобы он использовал метод для создания popover программным способом.
Кнопка, созданная в ViewDidLoad в моем представлении controller.m
UIView *moreFundInfoView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 540, 620)];
[self.view addSubview:moreFundInfoView];
[moreFundInfoView setBackgroundColor:[UIColor RMBColor:@"b"]];
btnContact = [UIButton buttonWithType:(UIButtonTypeRoundedRect)];
[btnContact setFrame:CGRectMake(390, 575, contactButton.width, contactButton.height)];
btnContact.hidden = NO;
[btnContact setTitle:@"Contact" forState:(UIControlStateNormal)];
[moreFundInfoView addSubview:btnContact];
[btnContact addTarget:self action:@selector(showContactDetails:) forControlEvents:UIControlEventTouchUpInside];
Затем у меня есть метод, который я использую при нажатии кнопки.
-(void) showContactDetails: (id) sender
{
UIViewController *popoverContent = [[UIViewController alloc]init];
UIView *popoverView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 200, 300)];
[popoverView setBackgroundColor:[UIColor RMBColor:@"b"]];
popoverContent.view = popoverView;
popoverContent.contentSizeForViewInPopover = CGSizeMake(200, 300);
UIPopoverController *contactPopover =[[UIPopoverController alloc] initWithContentViewController:popoverContent];
[contactPopover presentPopoverFromRect:btnContact.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES ];
[contactPopover setDelegate:self];
}
Что мне здесь не хватает? Потому что он работает нормально, но как только я нажимаю кнопку, приложение падает. Я думаю, что это вопрос делегата, но я не уверен. Любые советы будут оценены.
Ответы
Ответ 1
Я думаю, этот код поможет вам. Вам, конечно, не хватает методов делегирования
ViewController *viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController];
UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:navigationController];
popover.delegate = self;
popover.popoverContentSize = CGSizeMake(644, 425); //your custom size.
[popover presentPopoverFromRect:button.frame inView:self.view permittedArrowDirections: UIPopoverArrowDirectionLeft | UIPopoverArrowDirectionUp animated:YES];
Просто убедитесь, что вы не забываете методы делегатов UIPopover, иначе приложение обязательно сработает. Это обязательно.
Ответ 2
UIViewController *controller = [[UIViewController alloc] init];
[view removeFromSuperview]; //view is a view which is displayed in a popover
controller.view = view;
UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:controller];
popover.delegate = self;
[popover presentPopoverFromRect:button.frame inView:self.view permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];
Ответ 3
Все, что мне нужно было сделать, это изменить свойство "сохранить" на "сильный" в файле .h, и оно работает, остановило приложение от сбоя.
Ответ 4
Да, изменение свойства для "сохранить" до "сильного" позволяет удерживать объект просмотра.
Я думаю, что проблема с вашим кодом заключалась в том, что объект UIPopoverController автоматически освобождается при завершении метода.
создание сильного свойства позволяет вам точно указать объект.