2012-10-08 36 views
5

Khi người dùng ở trên trang đầu tiên của UIPageViewController và cố gắng quay trở lại, tôi chỉ đơn giản trả lại không. Trong iOS 5, điều này hoạt động tốt. Điều này gây ra sự cố trong iOS 6.Cách đặt trang đầu tiên trong UIPageViewController

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'The number of view controllers provided (0) doesn't match the number required (1) for the requested transition' 

Đây là mã của tôi. Khi trả lại contentViewController thay vì nil, nó hoạt động tốt. Tôi nên đặt gì thay vì nil?

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

    contentViewController = [[ContentViewController_iPhone alloc] init]; 

    int currentIndex = [self.modelArray indexOfObject:[(ContentViewController_iPhone *)viewController labelContents]]; 

    if ((currentIndex == 0) || (currentIndex == NSNotFound)) { 

     //if on the first page, can't go back 
     return nil; 

    } 

    contentViewController.labelContents = [self.modelArray objectAtIndex:currentIndex - 1]; 

    return contentViewController; 

} 
+0

Bạn có thể đơn giản trả về 'tự' thay vì' nil' không? Đây là phỏng đoán về phía tôi. –

+0

@JoshuaSmith Tôi đã thử, nhưng tôi vẫn gặp vấn đề tương tự. Cảm ơn mặc dù. –

+0

Trả về 'nil' chính xác là mẫu dự án“ Ứng dụng dựa trên trang ”của Apple xử lý các trang đầu tiên và trang cuối cùng như thế nào. Tôi nghĩ rằng bạn có một số vấn đề khác. Đặt một điểm ngắt ngoại lệ và đăng theo dõi ngăn xếp đầy đủ của ngoại lệ. –

Trả lời

10

Tôi đã có cùng một vấn đề và phát hiện ra nó chỉ xảy ra nếu tôi thay đổi các đại biểu của trang iewcontrollers gestureBộ nhận dạng tới bộ điều khiển của riêng tôi (điều này được thực hiện thường xuyên nếu bạn muốn hủy phân trang khi người dùng chạm vào các khu vực nhất định trên trang, ví dụ: các nút).

Đối với tôi, nó đã làm việc để không thực hiện việc chuyển nhượng lại cho iOS 6. Điều này là tốt, khi xử lý iOS chạm một chút khác nhau. Các nút hoặc bộ nhận dạng cử chỉ của riêng bạn trên trang sẽ hoạt động tốt dưới iOS 6 vì chúng có mức độ ưu tiên và sẽ tự động hủy phân trang.

Tôi hy vọng điều này sẽ hữu ích.

+0

Tôi sẽ thử điều này sau. Bạn nói rằng các nút và bộ nhận dạng cử chỉ của riêng tôi sẽ có ưu tiên trong iOS 6 ... đây cũng là một sự thay đổi từ iOS 5? Cảm ơn. –

+0

@Jack: vâng, tôi nghĩ rằng đó là một sự thay đổi (và lý do tại sao tôi nghĩ rằng cách tiếp cận cũ là không cần thiết nữa một số trường hợp) –

+0

Chỉ cần có cơ hội để thử điều này và nó đã làm việc. Cảm ơn! –

0

Bạn cần phải thêm dòng sau vào code của bạn

if (currentIndex == 0 || (index == NSNotFound)) { 

    //if on the first page, can't go back 
    return nil; 

} 
+0

Xin lỗi, điều đó không hiệu quả. Nó vẫn bị treo. Trả về 'nil' là vấn đề. Nó không thích vì lý do nào đó. Câu lệnh if không cần phải thay đổi. –

+0

Bạn có thể đặt điểm ngắt tại số không và kiểm tra xem nó có còn nhập khối này không? –

+0

Đó là, tôi đã sử dụng 'NSLog' trước đó và nó đã xuất ra nội dung của nó. Một lần nữa, tất cả điều này làm việc tốt trong iOS 5. Đó là iOS 6 đang gây ra vấn đề. –

0

Phiên bản mới nhất của Xcode trang dựa trên ứng dụng mẫu cung cấp đoạn mã sau:

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController 
{ 
    NSUInteger index = [self indexOfViewController:(DataViewController *)viewController]; 
    if ((index == 0) || (index == NSNotFound)) { 
    return nil; 
} 

index--; 
return [self viewControllerAtIndex:index storyboard:viewController.storyboard]; 
} 

Điều đó sẽ làm các trick: -)

+0

Cảm ơn, nhưng điều đó không hiệu quả. Trả lại 'nil' gây ra vấn đề. Khi tôi trả về một giá trị khác với 'nil', nó hoạt động tốt. Làm thế nào để tôi dừng nó đi đến trang trước trang đầu tiên nếu nil không hoạt động? –

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