2017-07-27 2 views
0

J'ai actuellement un UIPageViewController et j'en ai besoin pour changer de texte une fois qu'un bloc d'achèvement a fini de rester sur la même page. J'ai essayé de le faire de cette façon:Existe-t-il un moyen de modifier un texte d'étiquette depuis un UIPageViewController tout en restant sur la même page?

func addChainedAnimationView (titleLabel: String, descriptionLabel: String){ 
// 
(completion: {(finished) in 
    DispatchQueue.main.sync { 
          self.label1?.text = titleLabel 

         } 
     }) 
} 

mais je reçois une erreur

EXC_ BAD_ INSTRUCTIONS

Voici comment les contrôleurs de vue sont construits, il est raccourci de sorte que vous pouvez ignorer certains des paramètres:

public class WelcomePageView : UIView 
{ 
    public var animationStrings : [String]? 
    public var titleStrings: [String]? 
    public var descriptionStrings: [String]? 

    var index: Int = 0 
} 

    var label1 : UILabel? 
    var label2 : UILabel? 

    func buildViewControllerWithImage(titleString : String, titleString2 : String?, descriptionString: String, descriptionString2: String?, backgroundImage: String, jsonFile : String, jsonFile2 : String?, index : Int, loopCount: Int, userType: User, isLottieChained: Bool) -> UIViewController 
    { 

    let vc : UIViewController = UIViewController(nibName: "WelcomePageView", bundle: Bundle(for: type(of: self))) 
     (vc.view as? WelcomePageView)!.index = index 
     vc.view.frame = self.view.frame 
     var paragraphStyle = NSMutableParagraphStyle() 

    var label1String = titleString 
     if(!(label1String.contains("\n"))) { 
      label1String = "\n"+label1String 
     } 
     paragraphStyle = NSMutableParagraphStyle() 
     paragraphStyle.lineSpacing = 0 
     paragraphStyle.alignment = .center 
     paragraphStyle.minimumLineHeight = 24 
     label1 = (vc.view.viewWithTag(2) as? UILabel)! 
     label1?.font = UIFont.CustomBold(size: 20) 

     var attrString = NSMutableAttributedString(string: label1String) 
     attrString.addAttribute(NSParagraphStyleAttributeName, value:paragraphStyle, range:NSMakeRange(0, attrString.length)) 
     (vc.view.viewWithTag(2) as? UILabel)!.attributedText = attrString 
     return vc 
    } 

Je les obtiens de cette façon:

func getViewControllerWithImage(_ index: Int, userType: User, country: Country) -> UIViewController 

    { 
      vc = self.buildViewControllerWithImage(titleString:"FIRST_SCREEN_TITLE".localized, titleString2: nil, descriptionString: "FIRST_SCREEN_DESCRIPTION".localized, descriptionString2: nil, backgroundImage: "fractal_blue", jsonFile: "Welcome_Step_01_V01", jsonFile2: nil, index: index, loopCount: loopCount, userType: userType, isLottieChained: false) 

return vc 
    } 

Ils sont appelés ici:

public func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { 

    var index : Int = (viewController.view as? WelcomePageView)!.index // currentIndex = index 

//currentIndex = index 
//(viewController.view as? WelcomePageView)!.index 

print ("XXXXX after \(index) XXXXXXX ") 
//index = self.currentIndex 
index += 1 

if (index == maxPages) 
{ 
    index = 0 
} 
return self.getViewControllerWithImage(index, userType: User.newUser, country: 

checkCountry()) 
} 

Répondre

0

Je crois que votre question peut appeler sync au lieu de async sur DispatchQueue.main.

Vous êtes déjà dans la file d'attente principale, vous ne devriez donc jamais appeler la synchronisation, car cela entraînerait un blocage avec la file principale en attente sur elle-même.