2011-12-29 42 views
9

tôi đã nhìn đăng nhập được trình bày như một MVC và tôi có một cái nhìn đăng ký trình bày như một NavigationControlloer trên đầu trang của nó:Ẩn tất cả các bộ điều khiển xem phương thức

Đăng nhập (MVC) ----> Đăng ký (NavigationController)

tôi đang trình bày quan điểm đăng ký (createAccount) tại Loginview như sau:

createAccount= [[CreateAccount alloc] initWithNibName:@"CreateAccount" bundle:nil]; 

navController = [[UINavigationController alloc] initWithRootViewController:createAccount]; 

UIBarButtonItem *cancelButtun=[[UIBarButtonItem alloc]initWithTitle:@"Cancel" style:UIBarButtonItemStyleBordered target:self action:@selector(HideMe)]; 

UIBarButtonItem *registerButtun=[[UIBarButtonItem alloc]initWithTitle:@"Register" style:UIBarButtonItemStyleBordered target:self action:@selector(Register)]; 

createAccount.navigationItem.leftBarButtonItem = cancelButtun; 
createAccount.navigationItem.rightBarButtonItem=registerButtun; 
[email protected]"Create Account"; 

[self presentModalViewController:navController animated:YES]; 

bộ điều khiển đăng nhập có NSURLConnectionDelegate cho gian hàng đăng nhập và đăng ký. khi đăng ký kết thúc, tôi chỉ cần gọi số

[self dismissModalViewControllerAnimated:YES]; 

sẽ chỉ loại bỏ chế độ xem đăng ký.

tôi cũng muốn loại bỏ chế độ xem đăng nhập để tôi có thể quay lại ứng dụng chính của mình.

+0

Xin làm rõ làm thế nào bạn đang trình bày quan điểm đăng ký. Có một chế độ xem phương thức khác không? –

+0

Tôi đã chỉnh sửa bài đăng :) – Kassem

Trả lời

19

Kiểm tra câu trả lời của tôi đến một câu hỏi tương tự ở đây: Dismissing ModalViewController of ModalViewController

Tôi đang sử dụng khá nhiều điều tương tự như bạn trong ứng dụng của tôi, và giải pháp này làm việc cho tôi. Hãy chắc chắn để đọc các ý kiến ​​là tốt, kể từ khi một trong những tài liệu tham khảo thay đổi với iOS5.

Chỉnh sửa: Để loại bỏ chế độ xem phương thức được trình bày trên chế độ xem phương thức khác, bạn phải gọi dismissModalViewControllerAnimated: trên cấp độ gốc của cha mẹ.

iOS < 5,0

[[[self parentViewController] parentViewController] dismissModalViewControllerAnimated:YES]; 

iOS 5.0+ (phải thay đổi tất cả các tham chiếu tới parentViewController để presentingViewController)

[[[self presentingViewController] presentingViewController] dismissModalViewControllerAnimated:YES]; 
+1

+1 Điều này có hiệu quả đối với tôi. Nó sẽ là tốt đẹp nếu các giải pháp đã được bao gồm ở đây là tốt. –

+1

@JasonGeorge đã chỉnh sửa để bao gồm câu trả lời ... cảm ơn :) – superjessi

+2

Hãy cẩn thận: _dismissModalViewControllerAnimated_ ** deprecated ** (trong iOS 6.0), sử dụng _dismissViewControllerAnimated: completion: _ thay thế. – CFIFok

23

Gọi dismissModalViewController sẽ, nếu bộ điều khiển chế độ xem hiện tại không trình bày bất kỳ bộ điều khiển phương thức nào, hãy gọi phương thức trên cha mẹ của nó thay thế. Gọi phương thức trên một bộ điều khiển khung nhìn sẽ loại bỏ tất cả bộ điều khiển chế độ xem được trình bày cho bộ điều khiển đó. Để minh họa:

Nếu bạn có ba bộ điều khiển chế độ xem: vc1, vc2 và vc3 và vc1 là bộ điều khiển chế độ xem chính/hiện được sử dụng.

  1. Trong vc1 bạn trình bày phương thức vc2. Trong vc2, bạn gọi là bỏ qua, bởi vì không có vcs phương thức nào được trình bày từ vc2, thông báo bỏ qua được truyền cho phụ huynh (vc1) loại bỏ vc2 và bạn quay lại vc1.

  2. Trong vc1 bạn trình bày phương thức vc2, sau đó từ vc2 có dạng phương thức vc3. Việc hủy bỏ cuộc gọi trong vc3 sẽ gửi thông báo đến phụ huynh của nó (vc2) sẽ loại bỏ vc3. Để loại bỏ vc2 và vc3 cùng một lúc, bạn cần phải gọi bỏ qua trong vc1, điều này sẽ loại bỏ tất cả (cả hai) bộ điều khiển xem phương thức. Nếu loại bỏ hoạt ảnh, chỉ phim đầu tiên sẽ được làm động.

Một trong những cách tốt nhất để giải quyết vấn đề này là sử dụng bộ điều khiển điều hướng qua lại. tức là thay vì sử dụng modalViews ban đầu để hiển thị chế độ xem đăng nhập, hãy sử dụng chính nó navigationViewcontroller. Nếu bạn cần trình bày trang đăng ký. Đẩy chế độ xem đó. Nếu bạn cần goto chế độ xem ban đầu (nghĩa là ngoài loginView hoặc registrationView), thì hãy sử dụng phương thức popToRootViewControllerAnimated trong navigationViewcontroller.

+3

+1 Rất hữu ích để hiểu luồng vc. –

0

dismissModalViewControllerAnimated: loại bỏ tất cả các bộ điều khiển chế độ xem được trình bày ở đầu người gửi. Để bỏ lại với bộ điều khiển điểm cho rằng trình bày điều khiển đăng nhập, giữ một tham chiếu đến nó, miễn nhiệm như sau:

[loginController dismissModalViewController:animated] 

Đây là cách brute force để làm việc đó. Trong ứng dụng của tôi, nơi tôi đã làm một cái gì đó tương tự, tôi đăng các thông báo khác nhau tương ứng với phiên (ví dụ: đăng nhập) nhà nước và bộ điều khiển đăng nhập của tôi quan sát các thông báo đó và loại bỏ chính nó một cách thích hợp.

1

Vấn đề chính trước mắt là bộ điều khiển chế độ xem đăng nhập hoàn toàn không biết khi nào chế độ xem đăng ký bị loại bỏ và chúng tôi có thể xử lý điều đó với ủy quyền.

Đầu tiên khai báo giao thức và thuộc tính đại biểu trên bộ điều khiển chế độ xem đăng ký.

@protocol CreateAccountDelegate; 

@interface CreateAccount : UIViewController 

@property (nonatomic, assign) id <CreateAccountDelegate> delegate; 

@end 

@protocol CreateAccountDelegate <NSObject> 

- (void)createAccountViewControllerDidFinish:(CreateAccount *)controller; 

@end 

Tiếp theo, hãy đặt bộ điều khiển chế độ xem đăng nhập cho đại biểu của bộ điều khiển đăng ký.

createAccount = [[CreateAccount alloc] initWithNibName:@"CreateAccount" bundle:nil]; 
createAccount.delegate = self; 

Và thực hiện -createAccountViewControllerDidFinish:

- (void)createAccountViewControllerDidFinish:(CreateAccount *)controller 
{ 
    [self dismissModalViewControllerAnimated:YES]; 
} 

Cuối cùng, khi bạn bỏ từ bên trong bộ điều khiển đăng ký, thông điệp của các đại biểu để thông báo cho nó nếu miễn nhiệm sắp xảy ra của bạn.

[self.delegate createAccountViewControllerDidFinish:self]; 
[self dismissModalViewControllerAnimated:YES]; 

Bây giờ, có nói tất cả điều đó. Tôi có thể đề nghị thay đổi thiết kế của bạn không? Tôi sẽ trình bày bộ điều khiển xem đăng nhập như là một phần của bộ điều khiển chuyển hướng từ khi bắt đầu. Sau đó, nếu người dùng chọn đăng ký, chỉ cần đẩy chế độ xem đăng ký vào bộ điều khiển. Bằng cách này, bất kể bạn bỏ qua ở đâu, nó sẽ chỉ phải loại bỏ bộ điều khiển điều hướng chính.

0

Nơi phương pháp này trong đại biểu ứng dụng của bạn và nó sẽ loại bỏ tất cả các bộ điều khiển xem có một presentationViewController có nghĩa là chúng được trình bày một cách bình thường

-(void)dismissModalViews 
{ 
    if (self.window.rootViewController.presentedViewController) { 
     [self.window.rootViewController.presentedViewController dismissViewControllerAnimated:NO completion:nil]; 
     [self performSelector:@selector(dismissModalViews) withObject:nil afterDelay:0.5]; 
    } 
} 
+0

ngừng hoạt động với tôi trong iOS 7 – obiwahn

+0

sau đó bạn có một vấn đề khác, chỉ cần thử nghiệm trong xcode với mục tiêu Phát triển được đặt thành 7.0 và nó vẫn hoạt động. Hãy chắc chắn rằng bạn đang gọi phương thức này trong một NSObject thực hiện giao thức UIApplicationDelegate và bạn đã thiết lập self.window.rootViewController.Tôi không sử dụng bảng phân cảnh cho dự án – zurbergram

+0

Tôi đã thay đổi độ trễ thành 0,75 sau đó nó hoạt động. Tôi đã biên soạn một ứng dụng iOS 6 cho iOS 7. Có thể họ đã thay đổi thời gian vì trước đó nó đã hoạt động với 0,5 thời gian. – obiwahn

-2
while(self.presentedViewController) 
     [self.presentedViewController dismissViewControllerAnimated:NO completion:nil]; 

Làm việc để gạt bỏ tất cả trong iOS 7

0
[[[[UIApplication sharedApplication] keyWindow] rootViewController] dismissViewControllerAnimated:true completion:nil]; 

Bỏ qua tất cả các bộ điều khiển trừ RootViewController ..

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