2017-10-30 5 views
1

私は私のストーリーボードで作成した6つのビューコントローラを含むUIPageViewController PageVCを持っています。私のPageVCクラスはSwiftで書かれています。私はPageVCの次のインデックスに進むボタンが含まれているビューコントローラのそれぞれにおいて私のUIPageViewControllerの次のページは、ページが変更されたときに部分的にしか読み込まれません。

class PageVC: UIPageViewController, UIPageViewControllerDelegate { 

    lazy var VCArr: [UIViewController] = { 
     return [self.VCInstance(name: "OB1"), 
       self.VCInstance(name: "OB2"), 
       self.VCInstance(name: "OB3"), 
       self.VCInstance(name: "OB4"), 
       self.VCInstance(name: "OB5"), 
       self.VCInstance(name: "OB6")] 
    }() 

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

    } 

    override public func viewDidLoad() { 
     super.viewDidLoad() 

     self.delegate = self 
     if let OB1 = VCArr.first { 
      setViewControllers([OB1], direction: .forward, animated: true, completion: nil) 

     } 
    } 

    public func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController?{ 
     guard let viewControllerIndex = VCArr.index(of: 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, viewControllerAfter viewController: UIViewController) -> UIViewController?{ 
     guard let viewControllerIndex = VCArr.index(of: 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 presentationCount(for pageViewController: UIPageViewController) -> Int{ 

     return VCArr.count 

     } 

    public func presentationIndex(for pageViewController: UIPageViewController) -> Int{ 

     guard let OB1 = viewControllers?.first, 
      let OB1Index = VCArr.index(of: OB1) else { 
       return 0 

     } 

     return OB1Index 
    } 

    public func nextPageWithIndex(index: Int) 
    { 
     let nextVC = VCArr[index] 
     setViewControllers([nextVC], direction: .forward, animated: true, completion: nil) 

    } 


} 

-(void)pageNext { 

    PageVC *vc = (PageVC *) self.parentViewController; 
    [vc nextPageWithIndexWithIndex:2]; 

} 

上記の遷移は素晴らしい作品、そして完全にOB3負荷:含まれているビューコントローラの大半はので、私はこのように、次のページのメソッドを呼び出したObjective-Cで記述されたクラスを持っています。 OB3には、このような補完ハンドラで呼び出された次のページメソッドで通知のアクセス許可ダイアログを表示するボタンにIBOutletがあります。私は、通知の許可ダイアログにタップし、「許可する」とき

- (IBAction)enableBtn:(id)sender { 

    UNUserNotificationCenter* center = [UNUserNotificationCenter currentNotificationCenter]; 
    [center requestAuthorizationWithOptions:(UNAuthorizationOptionAlert + UNAuthorizationOptionSound) 
          completionHandler:^(BOOL granted, NSError * _Nullable error) { 

           [self pageNext]; 

           [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"notification"]; 

           [[NSUserDefaults standardUserDefaults] synchronize]; 

           FIRUser *user = [[FIRAuth auth] currentUser]; 
           NSString *topic = [@"/topics/ios_user_" stringByAppendingString:user.uid]; 
           [[FIRMessaging messaging] subscribeToTopic:topic]; 

          }]; 

    [[UIApplication sharedApplication] registerForRemoteNotifications]; 

} 

ページがスムーズに移行しますが、遷移が発生した後にOB4上の要素のいくつかは、ほぼ10秒のロードされません。たとえば、ボタンは表示されますが、内のテキストは表示されず、いずれもUILabelsではありません。私が約10秒待つと、彼らは現れます。私はPageVCインデックスのページを再配置しようとしましたが、ページを使用するページに関係なく、常に部分的に読み込まれているようです。正しく読み込まれていない要素にはアニメーションが添付されていません。私はそれがパーミッションダイアログの補完ハンドラと関係があると思います。私のUIPageViewControllerの次のページを移行時に完全にロードするにはどうしたらいいですか?

+1

メイン以外のスレッドからUIを更新しているようです。ディスパッチの中の '[self pageNext]'をメインキューに入れてみてください: 'dispatch_async(dispatch_get_main_queue()、^ {//メインスレッドのUIを更新してください});' – pbasdf

+0

これはうまくいきました!本当にありがとう。コメントを実際の回答として追加すると、私はそれを受け入れることができます。 –

+0

私は答え、感謝としてそれを追加しました。 – pbasdf

答えて

1

メイン以外のスレッドからUIを更新しているようですね。メインキューへのディスパッチ内に[self pageNext]を入れてみてください。

dispatch_async(dispatch_get_main_queue(), ^{ //update UI in main thread. 
    [self pageNext] 
}); 
関連する問題