2012-01-18 30 views
5

Tôi cần một chút trợ giúp về sự cố với bộ điều khiển điều hướng.popToRootViewControllerAnimated không hiển thị bộ điều khiển chế độ xem gốc

Tôi có navigationController với 4 ViewControllers bị đẩy. Vc cuối cùng tôi đẩy trình bày thêm ViewController một cách bình thường. Phương thức ViewController trình bày một ActionSheet. Tùy thuộc vào câu trả lời của người dùng, tôi chỉ bỏ qua phương thức ViewController hoặc tôi muốn quay lại thư mục gốc ViewController.

Trong ViewController giới modally tôi có:

- (void) dismissGameReport 
{  
    [[self delegate] GameReportModalWillBeDismissed:modalToPopToRoot];  
} 

Trong ngoái ViewController đẩy lên navigationController chồng tôi có:

- (void)GameReportModalWillBeDismissed: (BOOL)popToRoot; 
{  
    if (popToRoot) 
     { 
     [self.navigationController popToRootViewControllerAnimated:NO]; 
     } 
    else 
     { 
     [self dismissModalViewControllerAnimated:YES]; 
     }    
} 

Không chấp nhận quan điểm phương thức điều khiển hoạt động tốt. Tuy nhiên,

[self.navigationController popToRootViewControllerAnimated:NO]; 

không gây gốc ViewController để hiển thị quan điểm của mình. Thêm một số thông tin nhật ký Tôi thấy rằng sau khi thông báo đến self.navigationController ngăn xếp được xuất hiện chính xác nhưng việc thực thi tiếp tục theo tuần tự. Màn hình vẫn hiển thị khung nhìn của ViewController phương thức.

Như một giải pháp thay thế, tôi đã thử luôn loại bỏ bộ điều khiển chế độ xem phương thức và trong phương thức ViewWillAppear có thông báo popToRootAnimated. Không khác nhau. Tuy nhiên, ngăn xếp các bộ điều khiển được bật lên nhưng màn hình tiếp tục hiển thị chế độ xem của bộ điều khiển chế độ xem của tôi và việc thực thi tiếp tục tuần tự.

Ai đó có thể giúp tôi không?

+0

có bạn cố gắng để gỡ lỗi với điểm break rằng trình biên dịch của bạn đi vào vòng lặp nếu? – Hiren

Trả lời

6

Tôi thích những câu hỏi lừa đảo này. Nó có vẻ rất đơn giản, cho đến khi bạn cố gắng làm điều đó. Những gì tôi thấy là về cơ bản bạn cần phải loại bỏ bộ điều khiển xem phương thức đó, nhưng nếu bạn cố gắng bật từ bộ điều khiển điều hướng trên dòng tiếp theo thì mọi thứ sẽ bị lẫn lộn. Bạn phải đảm bảo việc loại bỏ hoàn tất trước khi thử pop. Trong iOS 5, bạn có thể sử dụng dismissViewControllerAnimated:completion: như vậy.

-(void)GameReportModalWillBeDismissed:(BOOL)popToRoot{  
    if (popToRoot){ 
     [self dismissViewControllerAnimated:YES completion:^{ 
      [self.navigationController popToRootViewControllerAnimated:YES]; 
     }]; 
    } 
    else{ 
     [self dismissModalViewControllerAnimated:YES]; 
    }    
} 

Nhưng tôi thấy bạn có 4.0 trong thẻ câu hỏi của bạn. Các giải pháp tôi tìm thấy cho <iOS 5 là ít hơn khá nhưng vẫn nên làm việc, và nó có vẻ như bạn đã có trên đường mòn. Bạn muốn viewDidAppear: không phải viewWillAppear:. Giải pháp của tôi ở đây bao gồm một Ivar, cho phép nói:

BOOL shouldPopToRootOnAppear; 

Và sau đó bạn GameReportModalWillBeDismissed: sẽ giống như thế này:

-(void)GameReportModalWillBeDismissed:(BOOL)popToRoot{  
    shouldPopToRootOnAppear = popToRoot; 
    [self dismissModalViewControllerAnimated:YES];   
} 

viewDidAppear: của bạn sẽ trông như thế này ...

-(void)viewDidAppear:(BOOL)animated{ 
    [super viewDidAppear:animated]; 
    if (shouldPopToRootOnAppear){ 
     [self.navigationController popToRootViewControllerAnimated:YES]; 
     return; 
    } 
    // Normal viewDidAppear: stuff here 
} 
+0

Xin chào. Tuyệt quá !!! Nó làm việc như một say mê. Cảm ơn rất nhiều, đã hơn 4 ngày tôi đã không thích thú với mã của tôi. Cảm ơn một lần nữa. – DanL

+0

Chào mừng bạn đến với stackoverflow.com. Vui mừng được giúp đỡ. Nếu câu trả lời này giải quyết được vấn đề của bạn thì bạn nên chấp nhận nó. – NJones

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