UIPopoverController увольняет без участия делегата
У меня есть вид карты, который я добавляю и удаляю annotations
с помощью переключателя в popovercontroller
. Когда я прикасаюсь за пределами popover
, он корректно отклоняется и вызывает метод delegate
popoverControllerDidDismissPopover:
. Проблема, с которой я столкнулась, заключается в том, что когда я переключаю переключатель в popover
(касаясь в представлении popover), если я я удаляю annotations
с карты, которая ведет себя корректно, а popover остается видимым, но если я добавляю annotations
к представлению карты, то popover
исчезает, а метод delegate
не вызывается. Кто-нибудь сталкивался с этим поведением раньше?
Единственное различие между кодом включения и выключения коммутатора заключается в том, что вы удаляете annotations
из массива, а другой добавляет annotations
. Это только проблема при добавлении annotations
к виду карты. Любая помощь или предложения будут оценены.
Вот как отображается popover
:
-(IBAction)toggleMapFiltersView:(id)sender
{
LayerPopoverViewController *popOverViewController = [[LayerPopoverViewController alloc] init];
[popOverViewController setDelegate:self];
[popOverViewController setBranchesShowing:branchesShowing];
[popOverViewController setSchoolsShowing:schoolsShowing];
[layersButton setSelected:YES];
popoverController = [[UIPopoverController alloc] initWithContentViewController:popOverViewController];
[popoverController setDelegate:self];
[popOverViewController release];
[popoverController presentPopoverFromRect:layersButton.frame
inView:[self view]
permittedArrowDirections:UIPopoverArrowDirectionAny
animated:YES];
}
Это метод, который вызывается из представления popover:
-(IBAction)toggleSchools:(id)sender
{
if ([self.delegate respondsToSelector:@selector(didChangeSchoolsDisplaySettingWithVisible:)])
{
if ([schoolsSwitch isOn])
{
[self.delegate didChangeSchoolsDisplaySettingWithVisible:YES];
self.schoolsShowing = YES;
}
else
{
[self.delegate didChangeSchoolsDisplaySettingWithVisible:NO];
self.schoolsShowing = NO;
}
}
}
и это метод, который он имеет в виду:
-(void)didChangeSchoolsDisplaySettingWithVisible:(BOOL)visible
{
if (visible == YES)
{
schoolsShowing = YES;
if (self.schoolArray != nil && [self.schoolArray count] > 0)
{
for (MySchool *school in self.schoolArray)
{
[mapView addAnnotation:school];
}
}
}
else
{
schoolsShowing = NO;
for (id<MKAnnotation> annotation in mapView.annotations)
{
if ([annotation isKindOfClass:[MySchool class]])
{
[mapView removeAnnotation:annotation];
}
}
}
}
Ответы
Ответ 1
Зачем использовать popovers в первую очередь? вам будет легче управлять пользовательским интерфейсом.
Вы можете создать собственное popupView и поместить его чуть выше нужных вам координат.
всплывающее окно имеет кнопку увольнения и делегирует вызов для этого действия.
Здесь некоторый код (в этом примере координаты от маркера, а mapView - google). Вам также придется преобразовать координаты в CGPoint.
UIAnnotationView *annotation = [[UIAnnotationView alloc] initWithFrame:CGRectMake(0,0,100,100)];
annotation.delegate = self;
annotation.tag = 101;
CGPoint point = [mapView.projection pointForCoordinate:marker.position];
annotation.origin = CGPointMake(point.x - annotation.width / 2, point.y - annotation.height - MARKER_DEFAULT_SIZE);
[mapView addSubview:annotation];
UIAnnotaionView closeButtonClicked Delegate:
- (void)annotationViewCloseButtonClicked:(UIAnnotationView *)annotationView
{
[[_mapView viewWithTag:101] removeFromSuperview];
}
Чтобы отклонить popupView при касании других точек на карте, переопределите этот делегат:
- (void)mapView:(GMSMapView *)mapView didTapAtCoordinate:(CLLocationCoordinate2D)coordinate
{
[[_mapView viewWithTag:101] removeFromSuperview];
}
Ответ 2
Вы пробовали еще один метод делегата
- (BOOL)popoverControllerShouldDismissPopover:(UIPopoverController *)popoverController {
// do some stuff here and decide whether to dismiss or not
return YES; //or No depending on your condition
}
Он спросит вас, хотите ли вы отклонить контроллер popOver или нет.
Он вызывается каждый раз, когда popoverviewcontroller собирается отклонить
В противном случае вы можете вызвать метод при добавлении аннотации в mapview. В любом случае, вы знаете, что поп-релиз отклоняется. Выполняйте ту же работу, когда поп-контроллер отключается. Как вы это делаете с
- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
Надеюсь, это поможет вам.