Проблема с управлением ScrollView из всплывающего окна

#ios #ipad

#iOS #iPad

Вопрос:

Я младший, и я действительно изо всех сил пытался заставить это работать, был бы очень признателен за помощь.

Я пытаюсь создать приложение, в котором вы можете прокручивать различные веб-просмотры, выбирая элемент из таблицы во всплывающем окне (пока всплывающее окно остается на месте). К сожалению, я не могу заставить свой ScrollView перемещаться, когда я выбираю элемент из всплывающего окна.

Я настроил UIScrollView с управлением страницей в главном UIViewController. ScrollView заполнен (pageViewController) UIWebViews. Основной UIViewController имеет панель навигации с кнопкой, при нажатии на кнопку создается всплывающее окно. Когда я выбираю элемент из таблицы во всплывающем окне, я хочу, чтобы мой UIScrollView прокручивался до определенной позиции (соответствует выбранной странице), но ScrollView не перемещается.

Приведенный ниже метод принимает значение, выбранное из всплывающего окна, и использует номер страницы, чтобы определить, куда должен прокручиваться ScrollView, но это не работает, потому что на данный момент мой ScrollView равен Null. При необходимости я могу предоставить больше кода.

основной код UIViewController.m:

     - (void)setDetailItem:(id)newDetailItem {


    if (detailItem != newDetailItem) {
        [detailItem release];
        detailItem = [newDetailItem retain];


        NSString *pgnum = [[NSString alloc] initWithString:[detailItem description]];
        int pg;

        if(pgnum == @"Page 1"){
            pg =1;

        }

        if(pgnum == @"Page 2"){

            pg =2;
        }

        if(pgnum == @"Page 3"){
           pg =3;
        }

        [pgnum release];

        pageControl.currentPage = pg;
        [self loadScrollViewWithPage:pg - 1];
        [self loadScrollViewWithPage:pg];
        [self loadScrollViewWithPage:pg   1];
        CGRect frame = scrollView.frame;
        frame.origin.x = frame.size.width * pg;
        frame.origin.y = 0;
        [scrollView scrollRectToVisible:frame animated:YES];
        pageControlUsed = YES;

    }

    if (popoverController != nil) {
        [popoverController dismissPopoverAnimated:YES];
    }   


}
  

Вот как я запустил popOverController
Информационная кнопка находится на панели навигации.
Значение ScrollView НЕ равно нулю в информационной кнопке

 - (void)infoButton:(id)sender {

NSLog(@"Entering: infoButton");

   // [self inspectView:self.view level:@""];

if (self.popoverController == nil) {
 PopoverViewController *popoverViewController = 
 [[PopoverViewController alloc]      
 initWithNibName:@"PopoverViewController" 
 bundle:[NSBundle mainBundle]]; 

 popoverViewController.navigationItem.title = @"Navigation";
 UINavigationController *navController = 
 [[UINavigationController alloc] 
 initWithRootViewController:popoverViewController];

 UIPopoverController *popover = 
 [[UIPopoverController alloc] 
 initWithContentViewController:navController]; 

 popover.delegate = self;
 [popoverViewController release];
 [navController release];

 self.popoverController = popover;
 [popover release];

 //NSLog(@"User pressed the info button");
 }

 [self.popoverController presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; }
  

Ответ №1:

UIPopover не являясь ни самым очевидным классом для использования с точки зрения управления памятью, ни самым стабильным, не требует, чтобы вы освобождали его перед представлением. Фактически, это приводит к возникновению фатального исключения! Всплывающие окна должны быть выпущены после их удаления с экрана и / или в -dealloc .

Комментарии:

1. Спасибо за вашу помощь. Я удалил [popover release], но это, похоже, не решило проблему. Моя проблема в том, что ScrollView не прокручивается до горизонтального положения после выбора номера страницы из всплывающего окна (ScrollView показывает null в отладчике).

2. Возможно, вы даже не создаете экземпляр ScrollView, или, как и всплывающее окно, вы можете освободить его, прежде чем начать вызывать его для прокрутки. Используйте свойство -contentOffset scrollview, чтобы установить его, и вернитесь к своим методам, чтобы проверить [[scrollview alloc] init …] и [scrollview release];

3. Еще раз спасибо за вашу помощь. Я удалил все версии, но у меня все еще была та же проблема. Поэтому вместо этого я попробовал другой подход. Я удалил таблицу из всплывающего окна и заменил кнопками. Это сработало. ScrollView перемещается в местоположение, связанное с кнопкой. Я предполагаю, что таблица и ее скроллер каким-то образом вызвали проблему. Еще раз спасибо за вашу поддержку в этом.

4. Нет проблем, удачи с этим.