【问题标题】:iOS:Unbalanced calls to begin/end appearance transitions for <UITableViewController>iOS:对 <UITableViewController> 的开始/结束外观转换的不平衡调用
【发布时间】:2015-09-18 12:09:23
【问题描述】:

我有一个UIPageViewController,我在其中动态创建了 3 个UITableViewController

!!!!!!这个问题只在我使用"Partial Curl"转场样式时出现。

如果我滚动UIPageViewController 太快,我会收到以下错误消息:

“开始/结束外观转换的不平衡调用 ”。

我这样创建UITableViewController

- (void)createTable {

CGRect frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);

_tableViewController1 = [[UITableViewController alloc] init];
_tableViewController2 = [[UITableViewController alloc] init];
_tableViewController3 = [[UITableViewController alloc] init];

_tableViewController1.tableView.frame = frame;
_tableViewController2.tableView.frame = frame;
_tableViewController3.tableView.frame = frame;

_tableViewController1.tableView.backgroundColor = [UIColor greenColor];
_tableViewController2.tableView.backgroundColor = [UIColor redColor];
_tableViewController3.tableView.backgroundColor = [UIColor blueColor];

_viewControllersArray = @[_tableViewController1, _tableViewController2, _tableViewController3];
[self setViewControllers:@[_tableViewController1]
               direction:UIPageViewControllerNavigationDirectionForward
               animated:NO completion:nil];
}


- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController{

    NSUInteger currentIndex = [_viewControllersArray indexOfObject:viewController];
    currentIndex--;

    if (currentIndex == -1) {
            currentIndex = 2;
            [self reloadTableView];
    }
    return [_viewControllersArray objectAtIndex:(currentIndex)];
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController{

    NSUInteger currentIndex = [_viewControllersArray indexOfObject:viewController];
    currentIndex++;

    if (currentIndex == 3) {
        currentIndex = 0;
        [self reloadTableView];
    }
    return [_viewControllersArray objectAtIndex:(currentIndex)];
}

【问题讨论】:

    标签: ios objective-c uitableview uipageviewcontroller


    【解决方案1】:

    问题在于初始化尚未完成,但它会进入下一页。你应该添加一个标志来监控动画过程。

    - (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray<UIViewController *> *)previousViewControllers transitionCompleted:(BOOL)completed{
    if (completed || finished)
        _pageIsAnimating = NO;
    }
    
    -(void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray<UIViewController *> *)pendingViewControllers{
    _pageIsAnimating = YES;
    }
    
    - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController{
    if (_pageIsAnimating){
        return nil;
    }
    

    【讨论】:

      【解决方案2】:

      我想我会添加 swift 2.2 等效项:

      class ExamplePageViewController: UIPageViewController {
          private var isAnimating = false
          // more codes follow
      
          override func viewDidLoad() {
              super.viewDidLoad()
      
              dataSource = self
              delegate = self
          }
      }
      
      // Data Source
      extension ExamplePageViewController: UIPageViewControllerDataSource
      {
          func pageViewController(pageViewController: UIPageViewController, willTransitionToViewControllers pendingViewControllers: [UIViewController]) {
              isAnimating = true
          }
      
          func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
              if isAnimating {
                  return nil
              }
      
              // more codes follow
          }
      
          func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
              if isAnimating {
                  return nil
              }
      
              // more codes follow
          }
      }
      
      // Delegate
      extension ExamplePageViewController: UIPageViewControllerDelegate {
          func pageViewController(pageViewController: UIPageViewController,
                                  didFinishAnimating finished: Bool,
                                  previousViewControllers: [UIViewController],
                                  transitionCompleted completed: Bool) {
      
              if (completed || finished) {
                  isAnimating = false
              }
      
              // more codes follow
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-30
        • 2016-05-28
        • 2012-01-23
        • 1970-01-01
        • 2021-04-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多