2017-01-21 2 views
-5

J'ai un UIViewController avec un UITableView. Ensuite, je crée un PageViewController avec deux viewcontroller. Pageview ne fonctionne pas si je transmets des données à l'enfant. Si je changeLorsque je transmets des données de TableView à l'enfant PageViewController, il peut passer à l'enfant suivant

setViewControllers([subjective], direction: .Forward, animated: true, completion: nil) 

à

setViewControllers([firstVC], direction: .Forward, animated: true, completion: nil) 

travail Pageview, mais les données ne passent pas. Je n'ai aucune idée à ce sujet. Aidez-moi s'il vous plaît. Merci

Code du travail:

contrôleur classe pageview:

import UIKit 

class PageVC : UIPageViewController, UIPageViewControllerDelegate, UIPageViewControllerDataSource { 

var lblhoten = String() 
var lblngaysinh = String() 
var lblsodt = String() 

lazy var VCArr: [UIViewController] = { 
    return [self.VCInstance("ThongTinBNPage2"), 
      self.VCInstance("ThongTinBNPage3")] 
}() 

private func VCInstance(name: String) -> UIViewController { 
    return UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier(name) 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.dataSource = self 
    self.delegate = self 
    if let firstVC = VCArr.first { 
     let subjective = self.storyboard?.instantiateViewControllerWithIdentifier("ThongTinBNPage2") as! VCSubjective 
     subjective.lblhoten = lblhoten 
     subjective.lblngaysinh = lblngaysinh 
     subjective.lblsodt = lblsodt 
     setViewControllers([subjective], direction: .Forward, animated: true, completion: nil) 
    } 
} 

public func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { 
    guard let viewcontrollerindex = VCArr.indexOf(viewController) else { 
     return nil 
    } 

    let previousindex = viewcontrollerindex - 1 


    guard previousindex >= 0 else { 
     return VCArr.last 
    } 

    guard VCArr.count > previousindex else { 
     return nil 
    } 

    return VCArr[previousindex] 
} 

public func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { 
    guard let viewcontrollerindex = VCArr.indexOf(viewController) else { 
     return nil 
    } 

    let nextindex = viewcontrollerindex + 1 


    guard nextindex < VCArr.count else { 
     return VCArr.first 
    } 

    guard VCArr.count > nextindex else { 
     return nil 
    } 

    return VCArr[nextindex] 
} 

public func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int { 
    return VCArr.count 
} 

// The selected item reflected in the page indicator. 
public func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int { 
    guard let firstviewcontroller = viewControllers?.first, 
     let firstviewcontrollerindex = VCArr.indexOf(firstviewcontroller) else { 
      return 0 
    } 

    return firstviewcontrollerindex 
} 

}

VCSubjective:

import UIKit 

class VCSubjective: UIViewController { 

@IBOutlet var hoten: UILabel! 
@IBOutlet var ngaysinh: UILabel! 
@IBOutlet var sodt: UILabel! 

var lblhoten = String() 
var lblngaysinh = String() 
var lblsodt = String() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view.   
    hoten.text = lblhoten 
    ngaysinh.text = lblngaysinh 
    sodt.text = lblsodt 
} 

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


} 
+0

Pourquoi j'ai deux downvotes ici? S'il vous plaît commenter au moins une raison de downvote quelqu'un! – ThinhLe

+1

Deux utilisateurs ont voté pour la fermeture de cette question car elle "ne sait pas ce que vous demandez". Peut-être reformuler votre question. Quel est le problème actuel et quelle est votre question? Évitez les termes comme "ne fonctionne pas" pour des raisons évidentes. Vous pouvez [modifier votre question ici] (http://stackoverflow.com/posts/41774975/edit). – shallowThought

+0

Sry à ce sujet. Mais je pense que j'ai essayé de mon mieux de présenter. – ThinhLe

Répondre

1

Le problème ici est que vous faites référence à deux objets complètement différents.

Dans viewDidLoad vous créez ThongTinBNPage2 viewController, puis l'ajoutez à la propriété viewControllers de la pageViewController. Cependant, les objets stockés dans VCArr sont deux viewControllers totalement différents.

Réfléchissons cette façon:

  1. Lorsque viewDidLoad est appelée vous créez viewController object #1
  2. vous assigneront l'viewController object #1 à l'objet de viewControllers du pageViewController faisant la valeur de viewControllers = [object #1]
  3. Dans pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? et pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? vous référencez l'objet VCArr. Le premier appel à VCArr, il crée paresseusement deux objets de contrôleur de vue complètement différents [object #2, object #3]

Pour résoudre ce code, vous devez effectuer les opérations suivantes:

if let firstVC = VCArr.first { 
    let subjective = firstVC // DO NOT create different VC here 
    subjective.lblhoten = lblhoten 
    subjective.lblngaysinh = lblngaysinh 
    subjective.lblsodt = lblsodt 
    setViewControllers([subjective], direction: .Forward, animated: true, completion: nil) 
} 
+0

Merci beaucoup. J'ai mis à jour à xcode 8 et swift 3 alors c'est fait. – ThinhLe