2016-04-11 2 views
0

В моем основном представлении Контроллер, у меня есть сегментированный элемент управления и вид контейнера ниже. Я хочу изменить представление контейнера всякий раз, когда я переключаю сегментированный элемент управления. Когда я переключаю вкладку, я вижу, что загружаемое изображение (print in viewDidload), однако, я считаю, что оно не работает с источником данных collectionViewDataSource. Есть идеи?Не удается показать UICollectionView с сегментированным управлением

enter image description here

// Main View 
let videoViewController = VideoViewController() 
let photoViewController = PhotoViewController() 


private var activeViewController: UIViewController? { 
    didSet { 
     removeInactiveViewController(oldValue) 
     updateActiveViewController() 
    } 
} 

@IBOutlet weak var containerView: UIView! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view. 
    activeViewController = videoViewController 

} 

@IBAction func segmentDidChanged(sender: UISegmentedControl) { 
    if sender.selectedSegmentIndex == 0 { 
     print("\(sender.titleForSegmentAtIndex(0)!) Selected") 
     activeViewController = videoViewController 

    } else if sender.selectedSegmentIndex == 1 { 
     print("\(sender.titleForSegmentAtIndex(1)!) Selected") 
     activeViewController = photoViewController 
    } 
} 


private func removeInactiveViewController(inactiveViewController: UIViewController?) { 
    if let inActiveVC = inactiveViewController { 
     // call before removing child view controller's view from hierarchy 
     inActiveVC.willMoveToParentViewController(nil) 

     inActiveVC.view.removeFromSuperview() 

     // call after removing child view controller's view from hierarchy 
     inActiveVC.removeFromParentViewController() 
    } 
} 

private func updateActiveViewController() { 
    if let activeVC = activeViewController { 
     // call before adding child view controller's view as subview 
     addChildViewController(activeVC) 

     activeVC.view.frame = containerView.bounds 
     containerView.addSubview(activeVC.view) 

     // call before adding child view controller's view as subview 
     activeVC.didMoveToParentViewController(self) 
    } 
} 

// PhotoView 
@IBOutlet weak var collectionView: UICollectionView! 


override func viewDidLoad() { 
    super.viewDidLoad() 

    // Do any additional setup after loading the view. 
    print("HI") 
} 
extension PhotoViewController : UICollectionViewDataSource { 

func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { 
    return 2 
} 

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    return 2 
} 

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as!PhotoCollectionViewCell 
    cell.backgroundColor = UIColor.blackColor() 
    // Configure the cell 
    cell.imgView.image = UIImage(named: "test") 
    return cell 
} 
} 

Когда я делаю PhotoViewController в качестве исходного контроллера, он работает.

enter image description here

+0

Я думаю, что 'collectionView' не загружается при добавлении в виде представления. –

+0

попробуйте 'activeVC.collectionView.reloadData()' в 'updateActiveViewController' перед добавлением своего представления в subview контейнера. –

+0

Это не работает :( – WeiJay

ответ

0

Я использовал UIContainerView и UISegmentControl, если вы используете ContainerView показать одного UIViewController уже размещены и ссылка приведены ниже,

When I add a UIContainerView to a view controller it's type is UIView. How do I get to the viewcontroller for the embedded view?

или если вы используете ContainerView показать два UIViewController при альтернативном щелчке UISegmentControl, чтобы показать единый код контроллера, приведен ниже,

First create main ViewController, with create segmentController and containerView, then create Two ViewController name 'FirstViewController' and 'SecondViewController', then you put CollectionView from Any ViewController.

Если вы создаете раскадровку, а затем пойти MainViewController Class и создать выходное отверстие

@property (weak, nonatomic) IBOutlet UIView *containerView; 
@property (weak, nonatomic) IBOutlet UISegmentedControl *segmentControl; 
@property (weak, nonatomic) UIViewController *currentViewController; 

метод ViewDidLoad:

UIFont *font = [UIFont boldSystemFontOfSize:16.0f]; 
    NSDictionary *attributes = [NSDictionary dictionaryWithObject:font 
                  forKey:UITextAttributeFont]; 
    [segmentControl setTitleTextAttributes:attributes 
            forState:UIControlStateNormal]; 

    _currentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"FirstViewController"]; 
    _currentViewController.view.layer.cornerRadius = 8.0f; 
    _currentViewController.view.translatesAutoresizingMaskIntoConstraints = NO; 

    [self addChildViewController:_currentViewController]; 
    [self addSubview:_currentViewController.view toView:_containerView]; 

И метод UISegmentController приведен ниже,

-(IBAction)indexChanged:(UISegmentedControl *)sender 
{ 
    if (sender.selectedSegmentIndex == 0) { 
     UIViewController *newViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"FirstViewController"]; 
     newViewController.view.translatesAutoresizingMaskIntoConstraints = NO; 
     [self cycleFromViewController:self.currentViewController toViewController:newViewController]; 
     self.currentViewController = newViewController; 
    } 
    else if (sender.selectedSegmentIndex == 1) 
    { 
     UIViewController *newViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"]; 
     newViewController.view.translatesAutoresizingMaskIntoConstraints = NO; 
     [self cycleFromViewController:self.currentViewController toViewController:newViewController]; 
     self.currentViewController = newViewController; 
    } 
} 

И два метода, связанные с представлением, -

- (void)addSubview:(UIView *)subView toView:(UIView*)parentView { 
    [parentView addSubview:subView]; 

    NSDictionary * views = @{@"subView" : subView,}; 
    NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[subView]|" 
                    options:0 
                    metrics:0 
                    views:views]; 
    [parentView addConstraints:constraints]; 
    constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[subView]|" 
                  options:0 
                  metrics:0 
                  views:views]; 
    [parentView addConstraints:constraints]; 
} 

- (void)cycleFromViewController:(UIViewController*) oldViewController 
       toViewController:(UIViewController*) newViewController { 
    [oldViewController willMoveToParentViewController:nil]; 
    [self addChildViewController:newViewController]; 
    [self addSubview:newViewController.view toView:self.containerView]; 
    [newViewController.view layoutIfNeeded]; 

    // set starting state of the transition 
    newViewController.view.alpha = 0; 

    [UIView animateWithDuration:0.5 
        animations:^{ 
         newViewController.view.alpha = 1; 
         oldViewController.view.alpha = 0; 
        } 
        completion:^(BOOL finished) { 
         [oldViewController.view removeFromSuperview]; 
         [oldViewController removeFromParentViewController]; 
         [newViewController didMoveToParentViewController:self]; 
        }]; 
} 

Если вы используете этот код, альтернативно открывайте ViewController из UIContainerView, когда щелкнете SegmentControl, если работаете с CollectionView из FirstViewController и его работа для меня!

Надеюсь, что это будет полезно.

+0

Я могу переключить два вида в контейнере с сегментированным контроллером, однако я получил сообщение об ошибке, если я добавил viewviewController. – WeiJay

+0

Ошибка Msg возникает в addubView: *** Прекращение приложение из-за неотображенного исключения «NSInvalidArgumentException», причина: «UICollectionView должен быть инициализирован с параметром макета не-nil» – WeiJay

+0

, если переключиться на два представления в контейнере с сегментированным управлением, используя uitableview, он работает отлично для меня, я думаю, что вы собираете некоторую ошибку , проблема его компоновки, и у меня есть решение, приведенное ниже [link] (http://stackoverflow.com/questions/24288927/uicollectionview-must-be-initialized-with-a-non-nil-layout-parameter) –