7

Như một cái nhìn tổng quan, tôi đang gặp vấn đề với một UINavigationController bên trong một khung nhìn gọi UITabBarControllerWillAppear bất cứ khi nào một khung nhìn được bật ra từ ngăn xếp.Vấn đề với UINavigationController bên trong của UITabBarController, viewWillAppear không được gọi là

Từ các đại biểu, một UITabBarController được làm bằng cách lập trình:

// Create views for Tab Bar 
    UINavigationController *view1 = [[UINavigationController alloc] initWithRootViewController:[[newsFeedNavigationController alloc] initWithStyle:UITableViewStylePlain]]; 
    resizedTabBatItem *tabBarItem1 = [[resizedTabBatItem alloc] initWithTitle:nil image:[UIImage imageNamed:@"newspaper.png"] tag:0]; 
    [view1 setTabBarItem:tabBarItem1]; 
    [tabBarItem1 release]; 

    UIViewController *view2 = [UIViewController new]; 
    resizedTabBatItem *tabBarItem2 = [[resizedTabBatItem alloc] initWithTitle:nil image:[UIImage imageNamed:@"speechbubble.png"] tag:1]; 
    [view2 setTabBarItem:tabBarItem2]; 
    [tabBarItem2 release]; 

.... 

// Create the tab bar controller 
    bookTabBarController = [BookTabBarController new]; 
    [[bookTabBarController view] setFrame:CGRectMake(0, 0, 320, 460)]; 

    // Add the views to it 
    NSArray *viewControllers = [NSArray arrayWithObjects:view1, view2, view3, view4, view5, nil]; 

    [[bookTabBarController tabBarController] setViewControllers:viewControllers]; 

newsFeedNavigationController của tôi là chỉ là một UITableViewController subclassed (và các lớp con không được can thiệp vào viewWillAppear, vì nó chưa bao giờ được gọi là trong newsFeedNavigationController). Trong đó, các mục mà khi nhấp vào sẽ đẩy một UIViewController mới vào ngăn xếp.

Vấn đề là bất cứ khi nào các khung nhìn được bật ra khỏi ngăn xếp, viewWillAppear không bao giờ được gọi trong newsFeedNavigationController và các mục trong danh sách vẫn được tô sáng. Tôi đã rối tung với điều này trong một vài giờ sáng tại thời điểm mà tôi cần một số trợ giúp để tìm hiểu những gì tôi đang làm sai.

Trong tin tức của tôiFeedNavigationController, tôi đã cố gắng thêm một NSLog để xem nó được gọi hay tôi đã làm gì đó, nhưng nó thậm chí không bao giờ được gọi.

- (void)viewWillAppear:(BOOL)animated { 
    NSLog(@"is viewWillAppear called?"); 
    [super viewWillAppear:animated]; 
} 

Edit:

rồi, bây giờ ở đây là cái gì lạ tôi nhận thấy:

Nếu tôi chạy:

[self presentModalViewController:(any UIview) animated:YES]; 

và sau đó bỏ qua nó, viewWillAppear bắt đầu hoạt động đúng khi popping và đẩy quan điểm ... Vì vậy, bây giờ tôi stumped. Nó không thực sự là một giải pháp nhưng có thể là một thứ gì đó đang diễn ra.

Trả lời

1

Để trả lời câu hỏi của riêng tôi, tôi đã tìm ra vấn đề là gì.

Để tuân theo "Không có UITabBarController bên trong của UINavigationController" của Apple, tôi đã viết bộ điều khiển thanh tab của riêng mình (bookTabBarController) dựa trên bộ điều khiển View chuẩn. Vấn đề của tôi là lớp không chuyển viewDidAppear xuống lớp quản lý các bộ điều khiển xem, vì vậy nó không bao giờ biết nó đang được hiển thị hay không.

+0

Tôi đang bối rối. Trong bài viết của bạn, bạn nói "UINavigationController bên trong của một UITabBarController" và trong theo dõi của bạn, bạn nói "UITabBarController bên trong của một UINavigationController" ... mà? Bởi vì tôi có một vấn đề giống hệt với một bộ điều khiển Nav như một tab trong một bộ điều khiển thanh tab ... mà, như tôi hiểu, nên được hỗ trợ. Nhưng ViewDidAppear chỉ bắt đầu làm việc sau khi tôi trình bày một khung nhìn phương thức từ một trong các khung nhìn được đẩy tới bộ điều hướng nav. Rất lạ. – Steve

+0

Xem câu trả lời của tôi cho một giải pháp chung cho vấn đề này. – titaniumdecoy

+0

Điều này cũng giống như vấn đề của tôi. Tôi xin lỗi vì khó hiểu. Những gì tôi đã có ban đầu là một UINavigationController w/một bộ điều khiển xem, và sau đó màn hình "nhà" sẽ chứa những gì về cơ bản là một UITabBarController tiếp theo trong ngăn xếp. Sau đó, bạn có thể đẩy chế độ xem mới vào ngăn xếp. Ví dụ: UINavigationController w/login view là root, khi in, một uitabbar được đẩy vào, và các khung nhìn từ một bảng có thể được đẩy vào nav "chính". Vấn đề của tôi là viewWillAppear đã không được chuyển xuống ngăn xếp (Nó sẽ đi từ UINavigationController đến UITabBarController, nhưng không phải là chế độ xem của Tab Bar). – Dandy

1

Một giải pháp khác là đặt đại biểu của bộ điều khiển điều hướng. Trong các đại biểu, thực hiện các phương pháp sau đây:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { 
    [viewController viewWillAppear:animated]; 
} 

này sẽ đảm bảo rằng viewWillAppear sẽ được gọi vào bất kỳ điều khiển xem có cái nhìn sắp xuất hiện trong bộ điều khiển chuyển hướng. Nếu bạn làm theo cách này, viewWillAppear được gọi là bất kể xem có xuất hiện không vì nó đang được đẩy hoặc xuất hiện vì một chế độ xem phụ đang bị xuất hiện.

+0

Thật không may, tôi đã thử phương pháp này và nó không hoạt động. Vâng, nó đã làm việc, nhưng nó đã không. Vấn đề là mặc dù viewWillAppear: hoạt hình được gọi, nó không được chuyển vào subview chứa trong thanh tab bởi vì nó không được gọi rõ ràng trong viewWillAppear của thanh tab. Nhưng đối với những người khác gặp phải vấn đề, đây là một giải pháp tiềm năng. Mặc dù, nếu viewWillAppear: hoạt ảnh không hoạt động, điều đó có thể có nghĩa là có điều gì đó không đúng (như trong trường hợp của tôi). – Dandy

1

Một giải pháp cho vấn đề này là có UIViewController chứa UINavigationController vượt qua các thông báo mong muốn với nó. UINavigationController sẽ chuyển tiếp các thông điệp tới bộ điều khiển xem thích hợp. Nó có vẻ phản trực giác nhưng nó hoạt động.

@interface NavigationWrapperViewController : UIViewController { 
    // navigationController must be a subview of this view controller's view 
    UINavigationController *navigationController; 
} 
@property (nonatomic, assign) UINavigationController *navigationController; 
@end 

@implementation NavigationWrapperViewController 
@synthesize navigationController; 

-(void)viewWillAppear:(BOOL)animated { 
    [navigationController viewWillAppear:animated]; 
} 
-(void)viewDidAppear:(BOOL)animated { 
    [navigationController viewDidAppear:animated]; 
} 
-(void)viewWillDisappear:(BOOL)animated { 
    [navigationController viewWillDisappear:animated]; 
} 
-(void)viewDidDisappear:(BOOL)animated { 
    [navigationController viewDidDisappear:animated]; 
} 

@end

Bạn có thể tìm thấy giải pháp hoàn chỉnh hơn trên Pastebin (mà tôi không đăng).

Nhờ davidbenini.itjaekwon cho giải pháp này.

+0

Giải pháp này hơi không đầy đủ và liên kết dán-thùng là một chút lộn xộn cú pháp, nhưng tôi sẽ bị nguyền rủa nếu điều này không khắc phục được sự cố của tôi! Bạn Rock! –

1

Một lừa thậm chí đơn giản hơn:

Trong lớp con lại UITabBarController, ghi đè này:

-(void)loadView{ 

    [super loadView]; 

    //here goes the trick: 
    [self setSelectedIndex:1]; 
    [self setSelectedIndex:0]; 
} 
+0

Công việc này giúp tôi nhưng tôi thấy rằng việc thiết lập chỉ mục trở lại 0 ngay lập tức không hiệu quả. Tôi phải chờ cho đến khi viewDidAppear. Các trang khác không hiển thị hoặc nhấp nháy và hoạt động một điều trị vì chọn tab khác theo cách thủ công trước tiên có nghĩa là chế độ xem có vấn đề sẽ hoạt động. Một báo trước là chỉ mục bạn đặt nó phải chứa một trang rất đơn giản. Ban đầu, tôi đã thử chế độ xem với chế độ xem phụ và chế độ xem phụ biến mất nhưng vẫn có thể tương tác với người dùng, tức là vấn đề được chuyển sang tab đó thay thế. – RowanPD

0

OK, đây là cũ, rất cũ, nhưng tôi đã kết thúc ở đây với một vấn đề tương tự.

UITabViewController 
    UINavigationController 
     UITableViewController1 
     UITableViewController2 

Khi popping ra khỏi UITableViewController2, các viewWillAppear chức năng trong UITableViewController1 chưa từng được gọi.

Vấn đề: My UITabViewController lớp tùy chỉnh đã ghi đè viewWillAppear mà không cần thực hiện siêu thực thi.

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