2015-08-16 14 views
5

Tôi đã đấu tranh cuối tuần với vấn đề này và đã dành một thời gian dài googling để tìm giải pháp mà không có bất kỳ thành công.UIPageViewController không theo dõi chỉ mục trang

Trường hợp sử dụng của tôi khá đơn giản và tôi không thể tin rằng làm thế nào là khó khăn để làm cho một hành vi tầm thường như vậy hoạt động chính xác.

Ứng dụng của tôi là luồng được phân trang đơn giản, trong đó người dùng vuốt sang trái hoặc sang phải để xem trang tiếp theo hoặc trang trước. Tôi có một UIPageViewController và mỗi trang chứa một UITableView. Tôi đã có vấn đề cố gắng để theo dõi các chỉ số trang bên trong các chức năng viewControllerAfterViewController và viewControllerBeforeViewController vì những lý do giải thích ở đây: PageViewController delegate functions called twice

Tôi đã thử làm theo tất cả các cách giải quyết đề nghị cho vấn đề này (theo dõi các chỉ số bên willTransitionToViewControllers và didFinishAnimating) nhưng điều này không giải quyết được vấn đề của tôi khi các hàm viewController * ViewController vẫn phải trả về một viewController và vì chúng ban đầu được gọi hai lần, viewController trả về đầu tiên dường như là một cái được sử dụng và thứ hai đi qua dường như không để có bất kỳ ảnh hưởng nào.

Mặc dù tôi đã thấy nhiều câu hỏi và blog về vấn đề này, nhưng tôi chưa thấy một ví dụ nào cho thấy cách liên tục trả về khung nhìn chính xác từ chức năng ViewController * ViewController và sẽ rất biết ơn ví dụ. Vấn đề chính tôi không thể nhìn thấy một giải pháp là làm thế nào để xác định chỉ mục tiếp theo bên trong willTransitionToViewControllers nếu tôi chỉ có một viewController duy nhất có nội dung được cập nhật động khi tải trang. Nó có vẻ giống như một vấn đề gà và trứng với tôi; Tôi cần phải tìm ra nội dung để cập nhật trang, nhưng để làm điều đó tôi cần biết chỉ mục của trang là gì (là một phần của nội dung).

Sửa Đây là một phiên bản cất của mã bị ảnh hưởng:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    _pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageViewController"]; 
    _pageViewController.dataSource = self; 
    _pageViewController.delegate = self; 
    [self.view addSubview:_pageViewController.view]; 

    PageContentViewController *startingPage = [self viewControllerAtIndex:0]; 

    NSArray *viewControllers = @[startingPage]; 
    [_pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]; 

} 

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { 
    // Don't do any index calculations as the result is inconsistent 
    return [self viewControllerAtIndex:nextIndex]; 
} 

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { 
    // Don't do any index calculations as the result is inconsistent 
    return [self viewControllerAtIndex:nextIndex]; 
} 

- (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers { 
    // This value never changes because the global _pageViewContentController hasn't been updated yet 
    nextIndex = [((PageContentViewController *)pendingViewControllers[0]) pageIndex]; 
} 

- (PageContentViewController *)viewControllerAtIndex:(NSUInteger)index { 
    _pageContentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageContentViewController"]; 
    _pageContentViewController.pageIndex = index; 
    _pageContentViewController.title = index; 

    return _pageContentViewController; 
} 

Tôi đã sửa lỗi thứ tự mà các chức năng này được gọi và mong chờ sự _pageViewContentController toàn cầu trở nên thông dụng với các dữ liệu chính xác sau khi trang đã được chuyển đổi.

Chỉnh sửa 2 Để cung cấp thêm chi tiết về vấn đề của tôi; mỗi trang của tôi chứa một tiêu đề và một bảng liên kết web. Nhấp vào liên kết sẽ mở một WebViewController để hiển thị trang web đã chọn. Với giải pháp của Yunus bên dưới, mọi thứ hiển thị chính xác (tiêu đề và liên kết xuất hiện như mong đợi) nhưng vấn đề xuất hiện khi nhấp vào liên kết vì điều này tải liên kết từ trang tiếp theo. Có vẻ như giai đoạn dựng hình của trang xảy ra tại thời điểm dữ liệu chính xác, nhưng sau đó khởi động lại bộ điều khiển nội dung trang với dữ liệu không đúng sau khi kết xuất xong, đó là lý do dữ liệu liên kết thực sự sai (mặc dù dữ liệu được hiển thị tốt).

+0

Bạn có thể chia sẻ một số phần liên quan của mã không? –

+0

@YunusErenGuzel - đoạn mã được thêm vào. – bobby

+0

Làm thế nào để bạn mở WebViewController này? Bên trong UIPageViewController hoặc là phương thức hay vv? –

Trả lời

3

Hãy giữ tất cả các contentViewControllers có liên quan trong một mảng

self.contentViewControllers = [NSMutableArray new]; 
for(int i=0; i< MAX_INDEX; i++) { 
    [self.contentViewControllers addObject:[self viewControllerAtIndex:0]]; 
} 

Sau đó, những gì chúng ta cần làm là để quyết định xem điều khiển chúng ta nên hiển thị trên sau và trước khi phương pháp

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

    for(int i=0;i<self.contentViewControllers.count ;i++) 
    { 
    if(viewController == [self.contentViewControllers objectAtIndex:i]) 
    { 
     if(i-1 >= 0) 
     { 
     return [self.contentViewControllers objectAtIndex:i-1]; 
     } 
    } 
    } 
    return nil; 
} 

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

    for(int i=0;i<self.contentViewControllers.count ;i++) 
    { 
    if(viewController == [self.contentViewControllers objectAtIndex:i]) 
    { 
     if(i+1 < self.contentViewControllers.count) 
     { 
     return [self.contentViewControllers objectAtIndex:i+1]; 
     } 
    } 
    } 
    return nil; 
} 

Sau đó, trong phương thức chuyển đổi

- (void)pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers 
{ 
    UIViewController* viewController = [pendingViewControllers objectAtIndex:0]; 
    NSInteger nextIndex = [self.contentViewControllers indexOfObject:viewController]; 
    [self.pageControl setCurrentPage:nextIndex]; 
} 
+0

Xin chào Yunus. Cảm ơn bạn đã giúp đỡ. Tôi đã sửa đổi mã của tôi để thử đề xuất của bạn (đây là điều tôi đã thử vào cuối tuần nhưng không thành công). Trong ví dụ của bạn, bạn đang thiết lập giá trị nextIndex nhưng nó không bao giờ được sử dụng ở bất cứ đâu. Am i thiếu cái gì ở đây? – bobby

+0

Thực ra tôi vẫn giữ trống cho bạn tuy nhiên bạn muốn sử dụng. Tôi sử dụng nó với SMPageControl để giữ chỉ mục với '[self.pageControl setCurrentPage: nextIndex];' –

+0

Bạn có thể sử dụng ViewController này để xem nó hoạt động như thế nào. https://github.com/yunuserenguzel/sonicraph-ios/blob/master/sonicraph/View%20Controllers/SNCGoThroughViewController.m –

Các vấn đề liên quan