我的 UIPageViewController 中的下一页仅在页面更改时部分加载
The next page in my UIPageViewController is only loading partially when the page changes
我有一个 UIPageViewController PageVC
,其中包含我在故事板中创建的 6 个视图控制器。我的PageVC
class写在Swift.
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)
}
}
在每个包含的视图控制器中,我都有前进到 PageVC
的下一个索引的按钮。大多数包含的视图控制器都有 classes 写在 Objective-C 所以我这样调用下一页方法:
-(void)pageNext {
PageVC *vc = (PageVC *) self.parentViewController;
[vc nextPageWithIndexWithIndex:2];
}
上面的转换效果很好,OB3
加载完全。在 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];
}
当我在通知权限对话框中点击 "Allow" 时,页面过渡顺利,但 OB4
上的某些元素在过渡发生后近 10 秒内不会加载。例如,按钮出现但其中的文本不可见,UILabels
也不可见。如果我等待大约 10 秒,它们就会出现。我已经尝试重新排列 PageVC
索引中的页面,但无论我使用哪个页面,该页面总是显示为部分加载。没有动画附加到未正确加载的元素。我认为这与权限对话框中的完成处理程序有关。如何让 UIPageViewController
中的下一页在转换时完全加载?
听起来您正在从非主线程更新 UI。尝试将 [self pageNext]
放入主队列的调度中:
dispatch_async(dispatch_get_main_queue(), ^{ //update UI in main thread.
[self pageNext]
});
我有一个 UIPageViewController PageVC
,其中包含我在故事板中创建的 6 个视图控制器。我的PageVC
class写在Swift.
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)
}
}
在每个包含的视图控制器中,我都有前进到 PageVC
的下一个索引的按钮。大多数包含的视图控制器都有 classes 写在 Objective-C 所以我这样调用下一页方法:
-(void)pageNext {
PageVC *vc = (PageVC *) self.parentViewController;
[vc nextPageWithIndexWithIndex:2];
}
上面的转换效果很好,OB3
加载完全。在 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];
}
当我在通知权限对话框中点击 "Allow" 时,页面过渡顺利,但 OB4
上的某些元素在过渡发生后近 10 秒内不会加载。例如,按钮出现但其中的文本不可见,UILabels
也不可见。如果我等待大约 10 秒,它们就会出现。我已经尝试重新排列 PageVC
索引中的页面,但无论我使用哪个页面,该页面总是显示为部分加载。没有动画附加到未正确加载的元素。我认为这与权限对话框中的完成处理程序有关。如何让 UIPageViewController
中的下一页在转换时完全加载?
听起来您正在从非主线程更新 UI。尝试将 [self pageNext]
放入主队列的调度中:
dispatch_async(dispatch_get_main_queue(), ^{ //update UI in main thread.
[self pageNext]
});