Создайте UIPageViewController с UITableView на каждой странице.

Я уже довольно давно читал о переполнении стека, но это мой первый пост, только потому, что впервые у меня возникла проблема, которую никто еще не решил!

Ладно, к делу. Поместить UITableViews в UIPageView должно быть просто, но у меня возникают трудности. У меня есть ViewController и contentViewController. Я использую .xibs вместо раскадровки. ContentViewController.xib — это табличное представление, а ViewController.xib — это представление. Я ориентируюсь только на iPhone. UITableView подключен к источнику данных, делегату и ссылочному выходу с именем theTableView.

Проект строится, но когда я его запускаю, я получаю следующее сообщение об ошибке:

    2013-03-17 16:14:23.026 pageApp[775:c07] *** Assertion failure in -[UITableView layoutSublayersOfLayer:], /SourceCache/UIKit_Sim/UIKit-2380.17/UIView.m:5776
    2013-03-17 16:14:23.028 pageApp[775:c07] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Auto Layout still required after executing -layoutSubviews. UITableView's implementation of -layoutSubviews needs to call super.'
    *** First throw call stack:
    (0x1c93012 0x10d0e7e 0x1c92e78 0xb66665 0x6539f 0x10e46b0 0x228ffc0 0x228433c 0x228feaf 0x1042bd 0x4cb56 0x4b66f 0x4b589 0x4a7e4 0x4a61e 0x4b3d9 0x4e2d2 0xf899c 0x45574 0x4576f 0x45905 0x4e917 0x20eb 0x12157 0x12747 0x1394b 0x24cb5 0x25beb 0x17698 0x1beedf9 0x1beead0 0x1c08bf5 0x1c08962 0x1c39bb6 0x1c38f44 0x1c38e1b 0x1317a 0x14ffc 0x1d2d 0x1c55)
    libc++abi.dylib: terminate called throwing an exception

Это вылетает после -(void)viewDidLoad{} в ViewController.m, и я еще не научился исправлять ошибки автоматического макета / layoutSubview. Кто-нибудь еще знает, как?

У меня ограниченный опыт разработки для ios, поэтому я уверен, что у меня просто нет нужных частей в нужных местах. Для получения это далеко.

Мой код выглядит следующим образом:

ViewController.h

    #import <UIKit/UIKit.h>
    #import "contentViewController.h"

    @interface ViewController : UIViewController
    <UIPageViewControllerDataSource>
    {
        UIPageViewController *pageController;
        NSArray *pageContent;
    }
    @property (strong, nonatomic) UIPageViewController *pageController;
    @property (strong, nonatomic) NSArray *pageContent;
    @end

ViewController.m

    #import "ViewController.h"

    @interface ViewController ()

    @end

    @implementation ViewController
    @synthesize pageController, pageContent;

    - (contentViewController *)viewControllerAtIndex:(NSUInteger)index
    {
        // Return the data view controller for the given index.
        if (([self.pageContent count] == 0) || (index >= [self.pageContent count])) {
            return nil;
        }

        // Create a new view controller and pass suitable data.
        contentViewController *dataViewController =[[contentViewController alloc]initWithNibName:@"contentViewController"bundle:nil];
        dataViewController.dataObject =[self.pageContent objectAtIndex:index];
        return dataViewController;
    }

    - (NSUInteger)indexOfViewController:(contentViewController *)viewController
    {
        return [self.pageContent indexOfObject:viewController.dataObject];
    }

    - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
    {
        NSUInteger index = [self indexOfViewController:(contentViewController *)viewController];
        if ((index == 0) || (index == NSNotFound)) {
            return nil;
        }

        index--;
        return [self viewControllerAtIndex:index];
    }        

    - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
    {
        NSUInteger index = [self indexOfViewController:(contentViewController *)viewController];
        if (index == NSNotFound) {
            return nil;
        }

        index++;
        if (index == [self.pageContent count]) {
            return nil;
        }
        return [self viewControllerAtIndex:index];
    }

    - (void) createContentPages
    {
        NSMutableArray *pageStrings = [[NSMutableArray alloc] init];
        for (int i = 1; i < 4; i++)
        {        
            NSString *contentString = [[NSString alloc]initWithFormat:@"Chapter %d \nThis is the page %d of content displayed using UIPageViewController in iOS 5.", i, i];
            [pageStrings addObject:contentString];
        }
        pageContent = [[NSArray alloc] initWithArray:pageStrings];
    }

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        [self createContentPages];

        self.pageController = [[UIPageViewController alloc]initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];

        pageController.dataSource = self;
        [[pageController view] setFrame:[[self view] bounds]];

        contentViewController *initialViewController = [self viewControllerAtIndex:0];
        NSArray *viewControllers = [NSArray arrayWithObject:initialViewController];

        [pageController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];

        [self addChildViewController:pageController];
        [[self view] addSubview:[pageController view]];
        [pageController didMoveToParentViewController:self];
    }

    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }

    @end

ContentViewController.h

    #import <UIKit/UIKit.h>

    @interface contentViewController : UIViewController
    @property (strong, nonatomic) IBOutlet UITableView *theTableView;
    @property (strong, nonatomic) id dataObject;
    @property (strong, nonatomic) NSArray *pageContent;
    @end

ContentViewController.m

    #import "contentViewController.h"

    @interface contentViewController ()

    @end

    @implementation contentViewController
    @synthesize theTableView, dataObject, pageContent;

    - (void)viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:animated];
    }
    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    {
        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        if (self) {
            // Custom initialization
        }
        return self;
    }

    - (void) createContentPages
    {
        NSMutableArray *pageStrings = [[NSMutableArray alloc] init];
        for (int i = 1; i < 4; i++)
        {
            NSString *contentString = [[NSString alloc]initWithFormat:@"Chapter %d \nThis is the page %d of content displayed using UIPageViewController in iOS 5.", i, i];
            [pageStrings addObject:contentString];
        }
        pageContent = [[NSArray alloc] initWithArray:pageStrings];
    }

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        [self createContentPages];
    }

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection (NSInteger)section
    {
        return 4;
    }

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath (NSIndexPath *)indexPath
    {
        static NSString *simpleTableIdentifier = @"SimpleTableItem";

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
        }

        cell.textLabel.text = [pageContent objectAtIndex:indexPath.row];
        return cell;
    }

    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }

    @end

Так что, если кто-то может исправить меня, я был бы признателен.


person Sashah    schedule 17.03.2013    source источник
comment
Вы установили ContentViewController в качестве источника данных и делегата табличного представления? Вы подключили свой IBOutlet, theTableView к табличному представлению в IB?   -  person rdelmar    schedule 17.03.2013
comment
Я сделал это, но потом, когда это не сработало, я начал заново и забыл подключить его снова. Я соответствующим образом отредактирую свой вопрос, так как теперь у меня снова есть ошибка, которую я не мог исправить в первую очередь. Спасибо!   -  person Sashah    schedule 18.03.2013


Ответы (1)


Я смог решить свою собственную проблему, и, кажется, я просто немного запутался.

Комментарий от rdelmar направил меня на правильный путь, но я подключил делегата и источник данных к неправильному объекту. Мне пришлось подключить их к владельцу файла, чтобы он работал.

Кроме того, кажется, что TableView не нужен, и когда я удалил его, мой код внезапно заработал, как и ожидалось.

Если это недостаточно ясно для ответа, пожалуйста, скажите мне, как я могу быть более конкретным. Спасибо!

person Sashah    schedule 17.03.2013