2016-04-11 11 views
0

In meiner Hauptansicht Controller habe ich eine segmentierte Steuerung und eine Containeransicht darunter. Ich möchte die Containeransicht ändern, wenn ich das segmentierte Steuerelement umschalte. Wenn ich die Registerkarte umschalte, kann ich die gerade geladene Ansicht sehen (print in viewDidload), aber ich finde es nicht mit der Datenquelle von collectionViewDataSource arbeiten. Irgendwelche Ideen?UICollectionView kann nicht mit segmentierter Steuerung angezeigt werden

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 
} 
} 

Wenn ich die PhotoViewController als Anfangs Controller machen, es funktioniert.

enter image description here

+0

Ich denke 'collectionView' wird nicht auf addsubview als eine Ansicht geladen. –

+0

Probieren Sie 'activeVC.collectionView.ReloadData()' in 'updateActiveViewController' Methode aus, bevor Sie die Ansicht der Unteransicht des Containers hinzufügen. –

+0

Es ist nicht Arbeit :( – WeiJay

Antwort

0

Ich habe die UIContainerView und UISegmentControl verwendet, wenn Sie ContainerView zeigen einzelne UIViewController verwenden sind bereits gebucht und die Verbindung sind unten,

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?

oder Wenn Sie ContainerView zwei verwenden gegeben zeigen UIViewController, wenn alernativ auf UISegmentControl geklickt wird, um den Code des einzelnen Viewcontrollers zu zeigen,

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

Wenn Sie das Storyboard erstellen, dann Mainviewcontroller Klasse gehen und den Ausgang schaffen sind

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

ViewDidLoad Methode:

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]; 

Und UISegmentController Methode ist unten angegeben,

-(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; 
    } 
} 

Und die zwei ansichtsbezogenen Methoden sind

Wenn Sie diesen Code alternativ verwenden, öffnen Sie den ViewController von UIContainerView, wenn Sie auf SegmentControl klicken, wenn CollectionView von FirstViewController funktioniert und es für mich arbeitet!

Ich hoffe, es ist hilfreich ..

+0

Ich bin in der Lage, zwei Ansichten im Container mit segmentierten Controller zu wechseln, aber ich habe eine Fehlermeldung, wenn die Ansicht, die ich hinzugefügt habe, ist CollectionViewController. – WeiJay

+0

Fehler Msg tritt in addsubView: *** Beenden App aufgrund der nicht abgefangenen Ausnahme 'NSInvalidArgumentException', Grund: 'UICollectionView muss mit einem Nicht-Null-Layout-Parameter' – WeiJay

+0

initialisiert werden, wenn zwei Ansichten im Container mit segmentierter Steuerung während der Verwendung von uitableview für mich funktionieren, denke ich, dass Sie einige Fehler sammeln , sein Layout Problem und ich habe die Lösung unten [Link] (http://StackOverflow.com/Questions/24288927/uicollectionview-must-be-initialisierte-with-a-non-nil-layout-Parameter) –

Verwandte Themen