Как уже писал Эд Марти
Если вы хотите отклонить всплывающее окно нажатием кнопки, в каком-то соответствующем месте должна быть ссылка на всплывающее окно
Это очень верно; однако при отображении UIPopoverController класс, открывающий popovercontroller, уже сохраняет этот ресурс. Итак, что вы можете сделать, это использовать этот класс в качестве класса делегата для вашего Popover Controller.
Для этого вы можете сделать следующее, которое я использую в своем коде.
В классе, открывающем поповер, это мой код:
- (void)showInformationForView:(Booking*)booking frame:(CGRect)rect
{
BookingDetailsViewController *bookingView = [[BookingDetailsViewController alloc] initWithStyle:UITableViewStyleGrouped booking:booking];
[bookingView setDelegate:self];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:bookingView];
self.popController = [[UIPopoverController alloc] initWithContentViewController:navController];
[self.popController setDelegate:self];
[self.popController setPopoverContentSize:CGSizeMake(320, 320)];
rect.size.width = 0;
[self.popController presentPopoverFromRect:rect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];
}
- (void)dismissPopoverAnimated:(BOOL)animated
{
[self.popController dismissPopoverAnimated:animated];
}
Итак, я делаю UINavigationController
и устанавливаю BookingDetailsViewController
в качестве rootViewController
. Затем я также добавляю текущий класс в качестве делегата к этому BookingDetailsViewController
.
Второе, что я добавил, это метод увольнения под названием dismissPopoverAnimated:animated
.
В мой BookingDetailsViewController.h
я добавил следующий код:
[...]
@property (nonatomic, strong) id delegate;
[...]
И в мой BookingDetailsViewController.m
я добавил этот код:
[...]
@synthesize delegate = _delegate;
- (void)viewDidLoad
{
UIBarButtonItem *closeButton = [[UIBarButtonItem alloc] initWithTitle:@"Close" style:UIBarButtonItemStylePlain target:self action:@selector(closeView)];
[self.navigationItem setRightBarButtonItem:closeButton];
[super viewDidLoad];
}
- (void)closeView
{
if ([self.delegate respondsToSelector:@selector(dismissPopoverAnimated:)]) {
[self.delegate dismissPopoverAnimated:YES];
}
else {
NSLog(@"Cannot close the view, nu such dismiss method");
}
}
[...]
Что происходит, когда при нажатии кнопки «Закрыть» в UINavigationController вызывается метод closeView
. Этот метод проверяет, отвечает ли делегат на dismissPopoverAnimated:animated
и, если это так, он вызывает его. Если он не отвечает на этот метод, он покажет сообщение в журнале и больше ничего не будет делать (поэтому он не потерпит крах).
Я написал свой код с использованием ARC, поэтому управление памятью отсутствует.
Надеюсь, это помогло вам.