2013-03-20 30 views
6

Thiết lập bảng phân cảnh đơn giản: UIViewController với UINavigationController. Trên một ô bảng, bấm vào một phân đoạn tùy chỉnh sẽ đẩy một UIViewController mới vào ngăn dẫn hướng. Tất cả đều tốt. Nhưng sau đó nhấn nút "quay lại" trong thanh điều hướng, nó chỉ sử dụng hoạt ảnh pop mặc định.thư giãn với tùy chỉnh segue trên UINavigationController pop thông qua "trở lại" nút

Làm cách nào để yêu cầu trình điều khiển điều hướng sử dụng phân đoạn tùy chỉnh của tôi khi bật trở lại? Tôi đã thêm

- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier 

- (BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender 

cho cả hai trình điều khiển chế độ xem nhưng không được gọi.

Tôi đang thiếu gì?

Trả lời

11

Bạn có thể thực hiện việc này bằng cách tạo chuyển đổi tùy chỉnh thay vì sử dụng phân đoạn tùy chỉnh. Tôi mất một thời gian để hiểu, nhưng về cơ bản nó rất đơn giản. Chỉ cần chắc chắn rằng bộ điều khiển xem đầu tiên của bạn thông qua giao thức UINavigationControllerDelegate. Sau đó, vẫn trong bộ điều khiển xem đầu tiên, thực hiện các phương pháp sau đây:

- (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController 
           animationControllerForOperation:(UINavigationControllerOperation)operation 
              fromViewController:(UIViewController *)fromVC 
              toViewController:(UIViewController *)toVC 
{ 
return X // where X is an animation Controller object, an instance of the animator class. 
} 

Vẫn trong bộ điều khiển xem đầu tiên, ví dụ như trong viewDidLoad, kể navigationcontroller rằng bộ điều khiển xem đầu tiên sẽ đóng vai trò là đại biểu của nó:

self.navigationController.delegate = self; 

Cuối cùng nhưng không kém phần quan trọng, hãy tạo lớp hoạt ảnh thông qua giao thức UIViewControllerAnimatedTransitioning. Thực hiện các phương pháp sau:

- (void)animateTransition:(id<UIViewControllerContextTransitioning>)transitionContext 

- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext 

Phương pháp đầu tiên nắm giữ các mã chuyển đổi. Mã chuyển tiếp này sẽ tự động được sử dụng khi nhấn vào nút quay lại.

Đây là một đơn giản example project.

+0

Tôi đã cố gắng để crack hoạt hình tùy chỉnh bằng cách sử dụng bảng phân cảnh cho ngày! Cảm ơn ! dự án ví dụ của bạn đã giúp rất nhiều. UpVoted! :) – NavinDev

+0

Tôi đã thêm phương thức ủy nhiệm điều hướng cho chính điều hướng và thiết lập ủy nhiệm cho chính nó và nó hoạt động, vì vậy bạn không phải thực hiện quy trình đó và sử dụng giao thức đó trong mọi vc trong ngăn xếp. – Arbitur

+0

@Arbitur Tôi giả định điều khiển điều hướng này của bạn được phân lớp và được kế thừa trên tất cả các trình điều khiển chế độ xem trong ngăn xếp, phải không? nếu không, làm thế nào bạn đang làm những gì bạn mô tả? – Pavan

2

Bạn đã cố gắng sử dụng một cái gì đó như:

- (UIStoryboardSegue *)segueForUnwindingToViewController:(UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier 
{ 
    return [MyCustomSegueInitMethod viewControllerA:vc1 viewControllerB: vcB]; 
} 

Tôi chưa bao giờ làm một segue tùy chỉnh, nhưng giả sử họ làm việc giống như tất cả những người khác làm gì khi trọng họ, miễn là lớp tùy chỉnh segue của bạn được subclassing UIStoryBoardSegue , nó sẽ hoạt động ...

Sau đó, hãy đảm bảo bạn đã liên kết nút quay lại của bạn với biểu tượng "thoát" trong thanh bên dưới trình điều khiển chế độ xem.

+0

Như đã nêu ở trên, tôi đã thử cách này và bộ chọn không được gọi. Cũng không có nút quay lại nào xuất phát từ bộ điều khiển điều hướng. – tcurdt

+1

Và đó là vấn đề của bạn ... Bạn cần tạo UIToolbar tùy chỉnh bằng nút UIButton "back" của riêng bạn và liên kết nó với biểu tượng thoát và gọi phương thức relax() qua sự kiện touchUpInside được kết nối mà bạn tạo cho nút quay lại . Vấn đề là, bạn không thể "nghỉ ngơi()" nếu bạn sử dụng phương pháp quay lại của bộ điều hướng. Bạn phải ẩn thanh UINavigation và thực hiện giải pháp của riêng bạn. – jpcguy89

+0

@tcurdt Xin lỗi, từ phía trên, đó là thanh công cụ UIToolbar với UIBarButtonItem, không phải là UIButton – jpcguy89

2

Cách ly thư giãn rất hữu ích để phân đoạn "cuộn ngược", bao gồm cả phân đoạn tùy chỉnh. Các vấn đề trong usecase của bạn không nằm với segues mỗi se, nhưng với thực tế là bạn muốn kích hoạt segue thư giãn từ nút quay lại.

này cho biết, bạn có thể cố gắng làm việc này bằng cách không sử dụng thư giãn, nhưng kích hoạt một segue tùy chỉnh khi the-back-button tiêu chuẩn được khai thác:

// MyDetailViewController.m: 
- (void)viewWillDisappear:(BOOL)animated 
{ 
    if ([self.navigationController.viewControllers indexOfObject:self] == NSNotFound) { 
     // trigger custom segue (but note that the sourceViewController 
     // has already been removed from the nav controller) 
    } 
    [super viewWillDisappear:animated]; 
} 

Rõ ràng đây không còn có bất cứ điều gì để làm với unwinding - nó chỉ là thực hiện một segue tùy chỉnh mà bạn thực hiện để "roll back" segue bạn sử dụng để "đẩy" bộ điều khiển xem chi tiết ở nơi đầu tiên.

Hãy cho tôi biết cách thực hiện điều này.

+0

Kích hoạt một khoảng cách tùy chỉnh không quay trở lại một phân đoạn. Kiểm tra các thông tin nhỏ được ra khỏi đó. Bạn phải tạo một số kết nối IBAction kỳ quặc để một công việc quay trở lại. – tcurdt

+0

Có, bạn sẽ cần phải (1) thực hiện một phương pháp với chữ ký này '- (IBAction) myUnwindMethod: (UIStoryboardSegue *) segue' trong bộ điều khiển xem cha mẹ của bạn, (2) kết nối một số điều khiển trong bộ điều khiển xem trẻ em. biểu tượng trong (hoặc gọi thủ công phương thức này từ -viewWillDisappear: trong trường hợp của bạn, bởi vì bạn muốn "chiếm đoạt" nút quay lại của bộ điều hướng) và (3) triển khai hai phương pháp bạn đề cập trong câu hỏi của bạn. –

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