有没有办法在保持在同一页面上的同时从 UIPageViewController 中更改标签文本?

Posted

技术标签:

【中文标题】有没有办法在保持在同一页面上的同时从 UIPageViewController 中更改标签文本?【英文标题】:Is there a way to change a label text from within a UIPageViewController while staying on same page? 【发布时间】:2017-07-27 16:09:07 【问题描述】:

我目前有一个 UIPageViewController,我需要它在完成块完成后更改文本,同时保持在同一页面上。我试过这样做:

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

                        
        )

但我得到一个错误

EXC_ BAD_ INSTRUCTION

这就是视图控制器的构建方式,它被缩短了,所以你可以忽略一些参数:

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
    

我是这样得到的:

  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
    

它们在这里被调用:

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())

【问题讨论】:

【参考方案1】:

我相信您的问题可能是在 DispatchQueue.main 上调用 sync 而不是 async

你已经在主队列中,所以你永远不应该调用同步,因为它会导致主队列自己等待的死锁。

【讨论】:

以上是关于有没有办法在保持在同一页面上的同时从 UIPageViewController 中更改标签文本?的主要内容,如果未能解决你的问题,请参考以下文章

如何强制两个数字在 LaTeX 中保持在同一页面上?

页面上的“缩放”元素,同时将放大中心保持在窗口的中心

同一张表上的多个事务,同时

Uipage控制动画

Joomla 2.5 组件升级同时保持文件不变

如何更改会话数据并保持在同一页面上?