私は私のストーリーボードで作成した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
の次のページを移行時に完全にロードするにはどうしたらいいですか?
メイン以外のスレッドからUIを更新しているようです。ディスパッチの中の '[self pageNext]'をメインキューに入れてみてください: 'dispatch_async(dispatch_get_main_queue()、^ {//メインスレッドのUIを更新してください});' – pbasdf
これはうまくいきました!本当にありがとう。コメントを実際の回答として追加すると、私はそれを受け入れることができます。 –
私は答え、感謝としてそれを追加しました。 – pbasdf