Bộ điều khiển thanh tab bên trong bộ điều khiển điều hướng hoặc chia sẻ chế độ xem gốc điều hướng


80

Tôi đang cố gắng triển khai giao diện người dùng có cấu trúc giống như trong ứng dụng Tweetie , hoạt động như vậy: bộ điều khiển chế độ xem cấp cao nhất dường như là bộ điều khiển điều hướng, chế độ xem gốc là chế độ xem bảng "Tài khoản". Nếu bạn nhấp vào bất kỳ tài khoản nào, tài khoản sẽ chuyển sang cấp thứ hai, có thanh tab ở phía dưới. Mỗi mục tab hiển thị một danh sách khác nhau và cho phép bạn xem chi tiết hơn (các cấp tiếp theo không hiển thị thanh tab).

Vì vậy, điều này có vẻ như phân cấp triển khai là:

  • UINavigationController
    1. Tài khoản :UITableViewController
    2. UITabBarController
      1. Tweet :UITableViewController
        • Chế độ xem chi tiết của một tweet / người dùng / v.v.
      2. Trả lời :UITableViewController
      3. ...

Điều này dường như hoạt động [^ 1], nhưng dường như không được hỗ trợ theo tài liệu SDK cho -pushViewController:animated:(đã thêm phần nhấn mạnh):

viewController : Bộ điều khiển chế độ xem được đẩy lên ngăn xếp. Nó không thể là một phiên bản của bộ điều khiển thanh tab.

Tôi muốn tránh các API riêng tư và những thứ tương tự, nhưng tôi không chắc tại sao việc sử dụng này bị cấm một cách rõ ràng ngay cả khi nó có vẻ hoạt động tốt. Có ai biết lý do không?

Tôi đã nghĩ đến việc đặt bộ điều khiển thanh tab làm bộ điều khiển chính, với mỗi tab chứa bộ điều khiển điều hướng riêng biệt. Vấn đề với điều này là mỗi bộ điều khiển nav cần phải chia sẻ một bộ điều khiển chế độ xem gốc duy nhất (cụ thể là bảng "Tài khoản" trong Tweetie ) - điều này dường như không hoạt động: việc đẩy bộ điều khiển bảng sang bộ điều khiển nav thứ hai dường như loại bỏ nó từ đầu tiên. Chưa kể tất cả việc ghi sổ khi chọn một tài khoản khác có lẽ sẽ là một khó khăn.

Làm thế nào tôi nên thực hiện điều này đúng cách?

[^ 1]: Bộ điều khiển thanh tab cần được phân lớp để mục điều hướng của bộ điều khiển thanh tab ở cấp đó vẫn đồng bộ với mục điều hướng của tab đã chọn và bộ điều khiển bảng của từng tab cần phải đẩy các chế độ xem chi tiết tương ứng của chúng lên self.tabBarController.navigationControllerthay vì self.navigationController.

Câu trả lời:


63

Hai câu trả lời trước đã đúng - tôi không sử dụng UITabBarControllertrong Tweetie. Khá dễ dàng để viết một tùy chỉnh XXTabBarController(lớp con đơn giản của UIViewController) rất vui khi được đẩy vào ngăn xếp điều khiển điều hướng, nhưng vẫn tồn tại theo triết lý "bộ điều khiển chế độ xem". Mỗi "tab" trên chế độ xem dành riêng cho tài khoản ( Tweets/ Replies/ Messages) là bộ điều khiển chế độ xem của riêng nó và theo như những gì họ lo ngại thì chúng sẽ được hoán đổi xung quanh trên màn hình bởi một màn hình đơn giản UITabBarController.


2
Làm thế nào để lớp bộ điều khiển thanh tab tùy chỉnh của bạn xử lý hệ thống ống nước cho các thuộc tính navigationItem và navigationController của bộ điều khiển con của nó?
bvanderveen

Điều này có thay đổi trong iOS 5 không? Tôi dường như có thể thêm UITabBarController vào UINavigationController mà không gặp quá nhiều vấn đề, ngay cả khi là bộ điều khiển gốc.
sparkFinder

33

Tôi đang xây dựng một ứng dụng sử dụng khung điều hướng tương tự như Tweetie. Tôi đã viết một bài về cách thực hiện việc này trên blog của tôi www.wiredbob.com, blog này cũng liên kết đến mã nguồn. Đó là một mẫu đầy đủ bạn có thể lấy và sử dụng làm cơ sở cho một dự án khác. Chúc may mắn!


10
Đối với những băn khoăn, các liên kết đến các bài viết trên blog được đề cập là wiredbob.com/blog/2009/4/20/...
Anh

@Robert Conn, hướng dẫn rất hay. Tôi đang sử dụng khái niệm của bạn, nhưng vì một số lý do mà tabBar của tôi không hoạt động. Điều này có xảy ra với bạn khi bạn đang triển khai ứng dụng của mình không?
A Salcedo

@ASalcedo: Tôi cũng gặp sự cố này nhưng nhận thấy rằng đó là do tôi cần giảm kích thước của các chế độ xem được liên kết với các mục trên thanh tab, kích thước chiều cao mặc định của 460 là lớn, trong mã nguồn tại www.wiredbob.com bạn sẽ thấy rằng chiều cao được đặt cho các mục tab là 369 để cho phép thanh tab. Để thay đổi chiều cao trong trình tạo giao diện, bạn cũng phải đảm bảo rằng trạng thái, thanh trên và dưới đều được đặt thành không có trong trình kiểm tra thuộc tính của chế độ xem (không rõ ràng ngay lập tức).
Izac

2
Bài đăng trên blog đã chết đối với tôi, bất kỳ cơ hội nào đó có một số người có điều đó nằm xung quanh?
Tiago Veloso

Liên kết bài đăng trên blog đang hoạt động: wiredbob.com/2009/04/iphone-tweetie-style-navigation.html
oluckyman,

10

Có thể thêm UITabBar vào bất kỳ UIViewController nào. Bằng cách đó, bạn không thực sự phải đẩy UITabBarController và do đó luôn tuân thủ các nguyên tắc của API Apple.

Trong trình tạo giao diện, UITabBar nằm trong "Windows, Views & Bars" trong Cocoa Touch Library.


1
Chào! @Himadri Choudhury bạn có thể giải thích "và do đó tuân theo các nguyên tắc của API Apple" - hoặc cung cấp tài liệu tham khảo? Tôi không thể tìm thấy hướng dẫn này được nói ở đâu (tôi không nghi ngờ nó tồn tại, nhưng tôi không thể tìm thấy URL). Thank you very much
darksider

10

Tôi làm điều này trong một vài ứng dụng của mình. Mẹo để thêm thanh tab vào ứng dụng dựa trên navigationController là KHÔNG sử dụng TabBarController. Thêm Tab Bar vào dạng xem, đặt bộ điều khiển dạng xem cho dạng xem đó thành TabBarDelegate và phản hồi các lựa chọn của người dùng trên thanh tab trong mã của bộ điều khiển dạng xem.

Tôi sử dụng Thanh Tab để thêm các dạng xem bổ sung vào dạng xem của Thanh Tab dưới dạng dạng xem phụ, để tải lại dạng xem bảng với các bộ dữ liệu khác nhau, để tải lại UIPickerView, v.v.


6

Tôi đã đấu tranh trong một giờ qua để thực hiện một UITabBarvì nó sẽ bị ẩn khi tôi cố hiển thị chế độ xem của mình; sau đó tôi tìm thấy bài đăng này :

Về cơ bản, hãy đảm bảo bạn chèn chế độ xem mới của mình bên dưới thanh tab, theo dòng mã này:

[self.view insertSubview:tab2ViewController.view belowSubview:myTabBar];

Cảm ơn điều này đã giúp sửa chữa thanh tab biến mất của tôi. Tôi đã sử dụng cùng một mã mà Robert Conn đề xuất nhưng bằng cách nào đó thanh tab ui biến mất khi tôi chuyển sang chế độ xem thứ hai.
Vijay Katam 22/10/12

3

Trong ứng dụng của tôi, bộ điều khiển chế độ xem gốc là bộ điều khiển UINavigation. Tại một thời điểm nhất định trong ứng dụng, tôi cần hiển thị UITabBar. Tôi đã thử triển khai UITabBar trên UIView trong phân cấp điều hướng, như một số bài viết trước đã đề xuất và điều này hoạt động. Nhưng tôi thấy rằng tôi muốn có nhiều hành vi mặc định hơn mà bộ điều khiển tab cung cấp và tôi đã tìm ra cách sử dụng UITabBarController với bộ điều khiển UINavigation:

1) Khi tôi muốn hiển thị chế độ xem của UITabBarController, tôi thực hiện như sau:

MyAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
appDelegate.window.rootViewController = myUiTabBarControllerInstance;

2) Khi tôi muốn quay lại nơi tôi đã ở trong hệ thống phân cấp điều hướng, tôi thực hiện điều này:

appDelegate.window.rootViewController = myNavControllerInstance;

3

Điều này có thể đạt được bằng cách chỉ cần nhúng TabBarController vào Bộ điều khiển Điều hướng. Trong bảng phân cảnh:

  1. Kéo một ViewController
  2. Nhấp vào Cảnh của ViewController
  3. Nhấp vào trình chỉnh sửa >> Nhúng vào >> Bộ điều khiển Điều hướng.
  4. Kéo một nút trên cùng một ViewController.
  5. Kéo TabBarController
  6. Kết nối nút trên ViewController với TabBarController thông qua push Segue Action.

Trong trường hợp này, chỉ RootViewController của TabBarController mới có trong ngăn xếp của Bộ điều khiển Điều hướng. Tất cả TabBarItems sẽ có Thanh điều hướng ở trên cùng và người dùng có thể truy cập Màn hình chính bất kỳ lúc nào, bất kể TabBarItem đã chọn

Điều này có thể được thực hiện tại bất kỳ ViewController nào trong ngăn xếp của Bộ điều khiển Điều hướng.

Nếu có hiệu quả, xin hãy gợi ý cho tôi cách tăng uy tín để tôi có thể đăng hình ảnh và code vào câu trả lời tiếp theo. :)


3

Đây là cách tôi đã làm nó. Điều này thực sự đang đẩy một bộ điều khiển thanh tab vào bộ điều khiển điều hướng. Nó hoạt động tốt. Tôi không tìm thấy bất kỳ nơi nào trong tài liệu rằng apple không hỗ trợ cách này. Ai đó có thể cho tôi liên kết đến cảnh báo này không?

Nếu đây là sự thật, có khả năng apple từ chối xuất bản ứng dụng của tôi lên appstore không?

-(void)setArrayAndPushNextController
{
    MyFirstViewController *myFirstViewController = [[MyFirstViewController alloc] init];
    MySecondViewController *mySecondViewController = [[MySecondViewController alloc] init];

    myFirstViewController.array = self.array;


    NSArray *array = [[NSArray alloc] initWithObjects:myFirstViewController, mySecondViewController, nil];
    UITabBarController *tab = [[UITabBarController alloc] init];
    tab.viewControllers = array;

    [array release];

    UITabBarItem *item1 = [[UITabBarItem alloc] initWithTitle:@"first title" image:nil tag:1];
    UITabBarItem *item2 = [[UITabBarItem alloc] initWithTitle:@"second title" image:nil tag:2];

    myFirstViewController.tabBarItem = item1;
    mySecondViewController.tabBarItem = item2;

    [self stopAnimatingSpinner];

    [self.navigationController pushViewController:tab animated:YES];

    [tab release];
    [item1 release];
    [item2 release];
}

bạn sương mù để phát hành UIViewControllers của bạn
Gargo

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.