2016-07-20 5 views
4
  1. Навигационный контроллер - Родитель
  2. Page ViewController - Дитя Navigation Controller
  3. DetailsViewController - ViewController будет отображаться в PageViewController.

My DetailsViewController содержит scrollview и массив detailsviewController с различными данными передается на просмотр страницы.PageViewController в NavigationController ребенка ViewController скроллинга выпуска в ИОС

Проблема заключается только в первом просмотре. Контроллер просмотра страницы отображается под навигационной панелью, и его scrollview работает.

Но отдых находится под навигационным контроллером, а функция прокрутки не работает.

First Details view controller working properly

Next DetailsViewController from dataset when i swipe. Here the content is pushed under navigation bar and scrollview not working

первое изображение: Сначала детали вид контроллер работает правильно

2-ое изображение: Следующая DetailsViewController из набора данных, когда я красть. Здесь содержимое подталкивается под панель навигации, а scrollview не работает

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

// 
// PagerViewController.swift 
// 
// 
// Created by Admin on 13/07/16. 
// 
// 

import UIKit 

class PagerViewController: UIPageViewController { 

    var result = Array<SearchResult>(); 
    var mainStoryBoard = UIStoryboard(name: "Main", bundle: nil); 
    var resultSet = [UIViewController](); 
    var currentIndex = 0; 
    // MARK: - Life cycle Methods 
    override func viewDidLoad() { 
     super.viewDidLoad(); 
     dataSource = self; 
     delegate = self; 
     generateDatset(); 
     let initialViewController = resultSet[currentIndex] ; 
     let viewControllers = NSArray(objects : initialViewController); 
     setViewControllers(viewControllers as? [UIViewController], direction: .Forward, animated: true, completion: nil); 
     self.navigationController!.edgesForExtendedLayout = .None; 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    // MARK: - Dataset Initialisation 

    func generateDatset() { 

     for searchResult in result { 
      let viewController = mainStoryBoard.instantiateViewControllerWithIdentifier(Constants.STORYBOARDUIFIELDS.DETAILSVIEWCONTROLLER) as? DetailsViewController; 

      viewController?.searchResult = searchResult; 
      resultSet.append(viewController!) 
     } 

    } 






} 

// MARK: - UIPageViewControllerDataSource 

extension PagerViewController : UIPageViewControllerDataSource { 

    func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { 


     guard let viewControllerIndex = resultSet.indexOf(viewController) else { 
      return nil; 
     } 

     let nextIndex = viewControllerIndex + 1; 

     guard resultSet.count > nextIndex else { 
         return nil; 
     } 

     currentIndex = nextIndex; 
     return resultSet[nextIndex]; 


    } 

    func scrollToNext(viewControllers : UIViewController) { 
     setViewControllers([viewControllers], direction: .Forward, animated: true, completion: nil) 
    } 

    func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { 
     guard let viewControllerIndex = resultSet.indexOf(viewController) else { 
      return nil; 
     } 
     let previousIndex = viewControllerIndex - 1; 

     guard previousIndex >= 0 else { 
      return nil; 
     } 
     currentIndex = previousIndex; 
     return resultSet[previousIndex]; 

    } 

} 


// 
// DetailsViewController.swift 
// 
// 
// Created by Admin on 13/07/16. 
// 
// 

import UIKit 

class DetailsViewController: UIViewController { 


    var searchResult : SearchResult? = nil; 

    @IBOutlet weak var ShoeImageView: UIImageView! 

    @IBOutlet weak var DnsItemCodeLabel: UILabel! 

    @IBOutlet weak var GeneralDetailsCollView: UICollectionView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     //print(navigationController) 

     DnsItemCodeLabel.text = "\(searchResult!.DNS!) - \(searchResult!.ItemCode!)"; 

     // converting base64encoded image into nsdata and then to ui image 

     let image = UIImage(data: NSData(base64EncodedString: searchResult!.Image!, options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters)!) 

     ShoeImageView.image = image; 

     // Assigning source to CollectionView 

     GeneralDetailsCollView.dataSource = self; 
     print(navigationController) 

    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 





} 

// MARK: - UICollectionViewDataSource 

extension DetailsViewController : UICollectionViewDataSource { 


    // returns the number of items 

    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
     return (searchResult!.summaryItems?.count)!; 
    } 

    //return the cell for given position 

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
      let cell = collectionView.dequeueReusableCellWithReuseIdentifier(Constants.STORYBOARDUIFIELDS.GENRAL_DETAILS_CELL, forIndexPath: indexPath) as! GeneralDetailsCell 
     if let data = searchResult?.summaryItems![indexPath.row] { 
      cell.TitleLable.text = data.Title!; 
      cell.ValueLabel.text = data.Value!; 
     } 

     return cell 

    } 


} 
+0

Вы имели в виду, что ваши DetailsViewControllers не показаны, кроме первого? –

+0

Пока не отображается подробный вид, но кроме первого, все остальные подталкиваются под панель навигации. Следовательно, верхняя часть перекрывается с navgaiton bar nad alos scrollview внутри не работает из-за этой проблемы –

+0

@ChiragJain: можете ли вы добавить скриншоты? –

ответ

3

Это случилось со мной один раз, так что я сделал в то время, я добавил нормальный ViewController и сделал его корневой контроллер NavigationViewController. Теперь я добавил элемент управления PageViewController в этом ViewController. Тогда все работало нормально. Короче говоря, несмотря на то, что NavigationController в качестве родительского контроллера делает корневой ViewController контроллера навигации в качестве родительского элемента PageViewController.

Я сделал экземпляр pageViewController в viewController.swift (корневая View Controller навигационного контроллера), ViewController.swift выглядит следующим образом:

import UIKit 

class ViewController: UIViewController,UIPageViewControllerDataSource,UIPageViewControllerDelegate { 
    var pageViewController:UIPageViewController? 
    var presentIndex = 0 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     self.pageViewController = UIPageViewController.init(transitionStyle: UIPageViewControllerTransitionStyle.Scroll, navigationOrientation: UIPageViewControllerNavigationOrientation.Horizontal, options: nil) 
     self.pageViewController!.dataSource=self 
     let initialViewController:DetailViewController = self.giveRequiredViewController(1) 
     let viewControllerArray:NSArray = [initialViewController] 
     self.pageViewController?.setViewControllers(viewControllerArray as! [DetailViewController], direction: UIPageViewControllerNavigationDirection.Forward, animated: true, completion: nil) 
     self.addChildViewController(self.pageViewController!) 
     self.view.addSubview((self.pageViewController?.view)!) 
     self.pageViewController?.didMoveToParentViewController(self) 
     self.view.backgroundColor=UIColor.blackColor() 
     self.navigationController?.navigationBar.barTintColor=UIColor.redColor() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func viewWillLayoutSubviews() { 
     let frame = CGRectMake(0, 64, self.view.frame.width, self.view.frame.height-40) 
     self.pageViewController?.view.frame = frame 
    } 

    func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { 
     presentIndex = (viewController as! DetailViewController).index! 
     if presentIndex==0{ 
      return nil 
     } 
     return self.giveRequiredViewController(presentIndex-1) 
    } 

    func giveRequiredViewController(index:NSInteger) -> DetailViewController { 
     let detailViewController = DetailViewController(nibName: "DetailViewController", bundle: nil) 
     detailViewController.index = index 
     return detailViewController 
    } 

    func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { 
     presentIndex = (viewController as! DetailViewController).index! 
     if presentIndex==1{ 
      return nil 
     } 
     return self.giveRequiredViewController(presentIndex+1) 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


} 

Я обеспечиваю индекс к DetailViewController, этот показатель будет в основном скажет мне какая страница будет представлена, и я соответствующим образом настрою свое мнение. На данный момент я изменил цвет фона для изменения вида. В настоящее время есть только две страницы, у вас может быть столько, сколько сможете.

DetailViewController.скор код выглядит следующим образом,

import UIKit 

class DetailViewController: UIViewController { 
    var index:NSInteger? 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     if index==0{ 
      self.view.backgroundColor=UIColor.blueColor() 
     }else{ 
      self.view.backgroundColor = UIColor.grayColor() 
     } 
     // Do any additional setup after loading the view. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

} 

Полный код можно найти в этом link

+0

Thanx для вашего решения, я попробую, но я думаю, что это вызовет проблему с производительностью (по памяти) –

+0

Можете ли вы рассказать мне сценарий увеличения памяти, я подумаю о каком-то другом решении. –

+0

hey @Sanchit Kumar Singh его не работает для меня у вас есть альтернативное решение –

0

Использование self.edgesForExtendedLayout = .None в контроллере представления родителя. Он отлично работает

+0

эй, я пробовал это раньше, но после настройки .edgesForExtendedLayout scrollview не работает –

0
self.edgesForExtendedLayout = .None 
self.automaticallyAdjustsScrollViewInsets = false; 
0

Try для настройки экземпляра PageViewController с:

self.automaticallyAdjustsScrollViewInsets = false; 

Для DetailsViewController, automaticallyAdjustsScrollViewInsets должно быть правдой.

Убедитесь, что оба PageViewController и DetailViewController имеют "Продлить Edges" настройки следующим образом: "В соответствии с Top Bars (Проверено)", "Под Bottom Bars (Проверено)" и "Под Непрозрачного Bars (Un-проверен)" (из интерфейса Builder или исходного кода).

Смежные вопросы