iPhone: Hiển thị UITableViewController phương thức với thanh Điều hướng


87

Tôi đang hiển thị một chế độ xem phương thức là một UITableViewControllerlớp. Vì một số lý do, nó sẽ không hiển thị thanh điều hướng khi tôi hiển thị nó. Đây là mã của tôi:

SettingsCreateAccount *detailViewController = [[SettingsCreateAccount alloc] initWithStyle:UITableViewStyleGrouped];
    detailViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    detailViewController.navigationController.navigationBarHidden = NO;
    [self.navigationController presentModalViewController:detailViewController animated:YES];
    detailViewController = nil;
    [detailViewController release];

Tôi nghĩ rằng nó đã được hiển thị theo mặc định? Nếu nó hữu ích, tôi đang gọi cái này từ một lớp khác cũng UITableViewControllerđược quản lý bởi a UINavigationController. Ý tưởng?

Câu trả lời:


146

Khi bạn trình bày một bộ điều khiển chế độ xem phương thức, nó không sử dụng bất kỳ bộ điều khiển điều hướng hoặc thanh điều hướng hiện có nào. Nếu tất cả những gì bạn muốn là hiển thị thanh điều hướng, bạn cần thêm thanh điều hướng làm chế độ xem phụ của chế độ xem phương thức và trình bày nó như bạn đang làm.

Nếu bạn muốn trình bày bộ điều khiển chế độ xem phương thức có chức năng điều hướng, bạn cần phải trình bày bộ điều khiển điều hướng phương thức có chứa bộ điều khiển chế độ xem chi tiết của bạn thay thế, như sau:

SettingsCreateAccount *detailViewController = [[SettingsCreateAccount alloc] initWithStyle:UITableViewStyleGrouped];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:detailViewController];
[detailViewController release];

navController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
[self presentModalViewController:navController animated:YES];
[navController release];

Bộ điều khiển phương thức của bạn sẽ quản lý ngăn xếp điều hướng của riêng nó.


Cảm ơn, tôi đánh giá cao lời giải thích để tôi biết mình đã làm gì sai.
Nic Hubbard

1
Nếu bạn sử dụng bảng phân cảnh, không có mã hóa nào liên quan để thực hiện điều này. Giải pháp tốt!
Jelle

36

Đây là một cách để hiển thị thanh điều hướng cho những người đang sử dụng bảng phân cảnh, được gợi ý bởi Hướng dẫn của Apple trên Bảng phân cảnh .

Bởi vì bộ điều khiển chế độ xem phương thức không được thêm vào ngăn xếp điều hướng, nó không nhận được thanh điều hướng từ bộ điều khiển điều hướng của bộ điều khiển chế độ xem bảng. Để cung cấp cho bộ điều khiển chế độ xem một thanh điều hướng khi được trình bày theo phương thức, hãy nhúng nó vào bộ điều khiển điều hướng của riêng nó.

  1. Trong dạng xem phác thảo, chọn Dạng xem Bộ điều khiển.
  2. Với bộ điều khiển chế độ xem được chọn, hãy chọn Trình chỉnh sửa> Nhúng vào> Bộ điều khiển điều hướng.

Hãy chắc chắn rằng bạn thêm segue phương thức để điều khiển Navigation và không phải là TableViewController
bickster

Trong tình huống của Twitter chỉnh sửa trang hồ sơ người dùng. Đây là một UITableViewController được trình bày theo phương thức và nó có các nút XONG và HỦY ở trên cùng. Câu trả lời này không có ý nghĩa về mặt ngữ nghĩa trong tình huống đó vì không có điều hướng xảy ra.
William Entriken

17

Trên iOS 7 và bạn chỉ muốn thanh điều hướng trên bộ điều khiển chế độ xem phương thức của mình hiển thị tiêu đề và một số nút? Hãy thử điều kỳ diệu này trong UITableViewController của bạn:

// in the .h
@property (strong) UINavigationBar* navigationBar;

//in the .m
- (void)viewDidLoad {
    [super viewDidLoad];

    self.navigationItem.title = @"Awesome";
    self.navigationBar = [[UINavigationBar alloc] initWithFrame:CGRectZero];
    [self.view addSubview:_navigationBar];
    [self.navigationBar pushNavigationItem:self.navigationItem animated:NO];
}

-(void)layoutNavigationBar{
    self.navigationBar.frame = CGRectMake(0, self.tableView.contentOffset.y, self.tableView.frame.size.width, self.topLayoutGuide.length + 44);
    self.tableView.contentInset = UIEdgeInsetsMake(self.navigationBar.frame.size.height, 0, 0, 0);
}

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
    //no need to call super
    [self layoutNavigationBar];
}

-(void)viewDidLayoutSubviews{
    [super viewDidLayoutSubviews];
    [self layoutNavigationBar];
}

Đường may để trở thành một cách tuyệt vời để làm mọi việc. nhưng khi tôi đang kiểm tra nó trên Static UITableViewController, tôi không thể cuộn chế độ xem bảng nữa. bất kỳ ý tưởng tại sao?
Thomas Besnehard

2
ngày nay tốt hơn bạn nên nhúng nó vào bộ điều khiển điều hướng.
malhal

Đó là một giải pháp hay nhưng có một vấn đề nhỏ là khi bạn cuộn tiêu đề tiêu đề ô hiển thị trên đầu thanh điều hướng.
Ali

Tôi đã giải quyết nó bằng cách thêm [self.view bringSubviewToFront:self.navigationBar];vào cuối -(void)layoutNavigationBar.
Ali

7

Tôi muốn chia sẻ cách giải pháp được chấp nhận có thể được sử dụng trong các dự án có bảng phân cảnh:

Cách tiếp cận đơn giản là đặt bộ điều khiển điều hướng trống trong bảng phân cảnh trước VC sẽ được trình bày theo phương thức, vì vậy các mối quan hệ trông giống như:

(Người trình bày VC) -> trình bày theo phương thức -> (bộ điều khiển điều hướng có bộ điều khiển được trình bày làm gốc của nó).

Chúng tôi đã thử cách tiếp cận này trong một thời gian và nhận thấy rằng bảng phân cảnh của chúng tôi trở nên "ô nhiễm" bởi một số lượng lớn các bộ điều khiển điều hướng trung gian như vậy khi mỗi! trong số chúng được sử dụng riêng cho một! bản trình bày của một số bộ điều khiển khác, mà chúng tôi muốn được trình bày theo phương thức với thanh điều hướng.

Giải pháp hiện tại của chúng tôi là đóng gói mã từ câu trả lời được chấp nhận vào một segue tùy chỉnh:

#import "ModalPresentationWithNavigationBarSegue.h"

@implementation ModalPresentationWithNavigationBarSegue

- (void)perform {
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:self.destinationViewController];

    [self.sourceViewController presentViewController:navigationController animated:YES completion:nil];
}
@end

Có segue này trong dự án của chúng tôi, chúng tôi không tạo bộ điều khiển điều hướng trung gian trong bảng phân cảnh của chúng tôi nữa, chúng tôi chỉ sử dụng ModalPresentationWithNavigationBarSegue này như:

Người trình bày VC -> Người trình bày VC

Tôi hy vọng rằng câu trả lời này sẽ hữu ích cho những người muốn tránh trùng lặp không cần thiết trong bảng phân cảnh ứng dụng của họ.


5

Nếu bạn chỉ cần một NavigationBar, bạn có thể thêm một phiên bản của UINavigationBarvà gán BarItems cho nó.


Điều đó phụ thuộc vào ViewController: tôi nghĩ bạn không thể thêm UINavigationBar vào UITableViewController, có thể không?
Tobias,

Trong IB, đi tới Trình chỉnh sửa -> Nhúng vào Bộ điều khiển Điều hướng, và bạn sẽ có Thanh Điều hướng. Kéo và thêm BarButtonItems vào đó.
AmitaiB

5

Tôi chỉ muốn thêm điều gì đó vào những gì @Scott đã nói. Câu trả lời của anh ấy chắc chắn là cách dễ nhất và được chấp nhận nhất hiện nay với Storyboards, iOS 7 và 8 ... (và sắp tới là 9).

Chắc chắn thêm một bộ điều khiển chế độ xem vào Bảng phân cảnh và Nhúng nó như được mô tả bởi @Scott là cách phù hợp để thực hiện.

Sau đó, chỉ cần thêm segue bằng cách điều khiển kéo từ bộ điều khiển chế độ xem nguồn đến mục tiêu (cái bạn muốn hiển thị theo phương thức), chọn "Trình bày theo phương thức" khi chế độ xem nhỏ xuất hiện với các lựa chọn cho loại segue. Có lẽ cũng nên đặt tên cho nó (trong ví dụ bên dưới tôi sử dụng "presentMyModalViewController").

Một điều mà tôi cần thiếu là trường hợp của @ Scott là khi bạn muốn thực sự chuyển một số dữ liệu vào bộ điều khiển chế độ xem được trình bày theo phương thức được nhúng trong bộ điều khiển điều hướng.

Nếu bạn lấy segue.destinationViewController, nó sẽ là UINavigationController, không phải bộ điều khiển bạn đã nhúng trong UINavigationController.

Vì vậy, để có được bộ điều khiển chế độ xem được nhúng bên trong bộ điều khiển điều hướng, đây là những gì tôi đã làm:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"presentMyModalViewController"]) {
        // This could be collapsed, but it's a little easier to see
        // what's going on written out this way.

        // First get the destination view controller, which will be a UINavigationController
        UINavigationController *nvc = (UINavigationController *)segue.destinationViewController;

        // To get the view controller we're interested in, grab the navigation controller's "topViewController" property
        MyModalViewController *vc = (EmailReceiptViewController *)[nvc topViewController];

        // Now that we have the reference to our view controller, we can set its properties here:
        vc.myAwesomeProperty = @"awesome!";
    }
}

Hi vọng điêu nay co ich!

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.