Как UIScrollView работает со StoryBoard и показывает разные UIViewControllers? - PullRequest
4 голосов
/ 22 января 2012

У меня есть StoryBoard. В том, что есть UIViewController - на что я положил UIScrollView и UIPageControl. И на каждой странице (скажем, у меня есть 3) я пытаюсь загрузить UIViewController (который показывает различные метки и значения таблицы).

Проблема - я могу загрузить все, но метка и таблица не видны. Ты, когда я пытаюсь изменить цвет фона для каждой страницы - он меняется. Я исследовал различные посты и код, но кажется, что ничто не работает / показывает UIScrollView с StoryBoard (с UIViewController, отображающим метки и таблицу).

Я могу сделать это с помощью загрузки отдельного файла XIB, но тогда весь процесс прерывается. Пожалуйста, смотрите мой код ниже.

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad
{
[super viewDidLoad];

//ScrollView and PageControl

// Create view controllers placeholder array
NSMutableArray *controllers = [[NSMutableArray alloc] init];
for (int i = 0; i < numberOfPages; i++) 
{
    [controllers addObject:[NSNull null]];
}
self.viewControllers = controllers;    
// Set Scroll View
scrollView.pagingEnabled = YES;
scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * numberOfPages, scrollView.frame.size.height);
scrollView.showsHorizontalScrollIndicator = NO;
scrollView.showsVerticalScrollIndicator = NO;
scrollView.scrollsToTop = NO;
scrollView.delegate = self; 
// Set Page Control
pageControl.numberOfPages = numberOfPages;
pageControl.currentPage = 0;
// Load the visible and next page
[self loadScrollViewWithPage:0];
[self loadScrollViewWithPage:1];
}

- (void)scrollViewDidScroll:(UIScrollView *)sender
{
if (pageControlUsed)
{
    // To know if scroll is valid - from Page Control
    return;
}

// Changes Page Control indicator
CGFloat pageWidth = scrollView.frame.size.width;
int page = floor((scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
pageControl.currentPage = page;

// Load the visible, previous and next pages
[self loadScrollViewWithPage:page - 1];
[self loadScrollViewWithPage:page];
[self loadScrollViewWithPage:page + 1];
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
{
pageControlUsed = NO;
}

- (void)loadScrollViewWithPage:(int)page
{
if (page < 0) return;
if (page >= numberOfPages) return;

// Load new Controller
ReportsDetailViewController *controller = [viewControllers objectAtIndex:page];
if ((NSNull *)controller == [NSNull null]) 
{
    controller = [[ReportsDetailViewController alloc] init];
    controller.pageNumber = [NSNumber numberWithInt:page];
    [viewControllers replaceObjectAtIndex:page withObject:controller];
}   
if (nil == controller.view.superview) 
{
    CGRect frame = scrollView.frame;
    frame.origin.x = frame.size.width * page;
    frame.origin.y = 0;
    controller.view.frame = frame;
    [scrollView addSubview:controller.view];
}
}

1 Ответ

3 голосов
/ 25 января 2012

Попробуйте создать ваши ViewControllers так:

YourViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"YourViewController"];

Вы можете установить идентификатор вашего контроллера представления в инспекторе атрибутов.

У меня была та же проблема сегодня, и это помогло мне.

...