Câu hỏi presentViewController và hiển thị thanh điều hướng


Tôi có hệ thống phân cấp bộ điều khiển xem và bộ điều khiển cao nhất được hiển thị dưới dạng phương thức và muốn biết cách hiển thị thanh điều hướng khi sử dụng

'UIViewController:presentViewController:viewControllerToPresent:animated:completion'

Các tài liệu cho 'presentViewController: animated: completion:' lưu ý:

'Trên iPhone và iPod touch, chế độ xem được trình bày luôn đầy màn hình.   Trên iPad, bản trình bày phụ thuộc vào giá trị trong   modalPresentationStyle property '.

Đối với 'modalPresentationStyle', các tài liệu nói:

Kiểu trình bày xác định cách hiển thị một bộ điều khiển xem được trình bày trên màn hình. Trên iPhone và iPod touch, bộ điều khiển chế độ xem phương thức luôn được hiển thị toàn màn hình, nhưng trên iPad có một số tùy chọn trình bày khác nhau.

Có cách nào để đảm bảo rằng thanh điều hướng hiển thị bên dưới thanh trạng thái khi điều khiển chế độ xem hiển thị chính nó? Tôi có nên giải thích tài liệu là, bạn không nhận được bất kỳ tùy chọn nào của iPhone / iPod và chỉ trên iPad không?

Trước đây, tôi đã sử dụng 'UIViewController:presentModalViewController:animated' đã hoạt động tốt, nhưng kể từ iOS 5.0, API đã không được chấp nhận nên tôi chuyển sang phiên bản mới.

Trực quan, những gì tôi đang tìm kiếm là có trang trình điều khiển mới ở dưới cùng của màn hình, giống như API cũ được sử dụng để thực hiện.

[cập nhật bằng mã]:

// My root level view:
UIViewController *vc = [[RootViewController alloc] 
                            initWithNibName:nil 
                            bundle:[NSBundle mainBundle]];
navController = [[UINavigationController alloc] initWithRootViewController:vc];        
....

// Within the RootViewController, Second view controller is created and added 
// to the hierarchy. It is this view controller that is responsible for 
// displaying the DetailView:
SecondTierViewController *t2controller = [[SecondTierViewController alloc] 
                                           initWithNibName:nil
                                           bundle:[NSBundle mainBundle]];

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

// Created by SecondTierViewController 
DetailViewController *controller = [[DetailViewController alloc] initWithNibName:nil                                                                                 
                                        bundle:[NSBundle mainBundle]];  

controller.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
controller.modalPresentationStyle = UIModalPresentationCurrentContext;

[self.navigationController presentViewController:controller 
                                        animated:YES 
                                        completion:nil];

76
2018-03-15 16:41


gốc




Các câu trả lời:


Đúng là nếu bạn trình bày một bộ điều khiển xem một cách bình thường trên iPhone, nó sẽ luôn được hiển thị toàn màn hình bất kể bạn trình bày nó như thế nào trên bộ điều khiển xem trên cùng của bộ điều khiển hoặc bất kỳ cách nào khác. Nhưng bạn luôn có thể hiển thị thanh điều hướng theo cách này:

Thay vì trình bày bộ điều khiển xem đó một cách khiêm tốn trình bày một bộ điều khiển điều hướng một cách bình thường với bộ điều khiển xem gốc của nó được đặt làm bộ điều khiển xem bạn muốn:

MyViewController *myViewController = [[MyViewController alloc] initWithNibName:nil bundle:nil];
UINavigationController *navigationController = 
    [[UINavigationController alloc] initWithRootViewController:myViewController];

//now present this navigation controller modally 
[self presentViewController:navigationController
                   animated:YES
                   completion:^{

                        }];

Bạn sẽ thấy thanh điều hướng khi chế độ xem của bạn được trình bày một cách bình thường.


170
2018-03-15 18:18



Đó là khá nhiều những gì tôi bắt đầu với. Nhưng lý do tôi không sử dụng 'currentModalViewController' là bởi vì nó được ghi nhận là một API không dùng nữa. - Jonas Gardner
đây là những gì đã được viết trong lớp UIViewController: // Hiển thị một bộ điều khiển xem khác như là một phương thức con. Sử dụng chuyển tiếp trang tính theo chiều dọc nếu phương thức animated.This đã được thay thế bằng presentViewController: animated: completion: // Nó sẽ bị DEPRECATED, lập kế hoạch cho phù hợp. - (void) presentModalViewController: (UIViewController *) modalViewController hoạt hình: (BOOL) hoạt hình; vì vậy chỉ cần gọi phương thức mới và vượt qua nil để hoàn thành và bạn sẽ tốt. - Manish Ahuja
Câu trả lời chính xác. Đã cập nhật để sử dụng (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion - Wayne Burkett
Khi tôi cố gắng trình bày một bộ điều khiển điều hướng, nó bị treo ('NSInvalidArgumentException', reason: 'Pushing a navigation controller is not supported'). Làm thế nào có thể làm việc này? - oarfish
Trong trường hợp của tôi nó cho thấy thanh nhưng các nội dung khác được đặt không chính xác trên trình bày hình ảnh động. Và chỉ sau khi hoạt hình này nó nhảy vào vị trí chính xác. - Vyachaslav Gerchicov


Swift 3.0 / 4.0

Dẫn đường:

guard let myVC = self.storyboard?.instantiateViewController(withIdentifier: "MyViewController") else { return }
let navController = UINavigationController(rootViewController: myVC)

self.navigationController?.present(navController, animated: true, completion: nil)

Quay lại:

self.dismiss(animated: true, completion: nil)

Swift 2.0

Dẫn đường:

let myVC = self.storyboard?.instantiateViewControllerWithIdentifier("MyViewController");
let navController = UINavigationController(rootViewController: myVC!)

self.navigationController?.presentViewController(navController, animated: true, completion: nil)

Quay lại:

self.dismissViewControllerAnimated(true, completion: nil)

25
2018-03-13 17:56



Nhưng Làm thế nào để thiết lập khi tôi thử mã của bạn sau đó chỉ thiết lập thanh điều hướng nhưng tôi không thể thay đổi tài sản của nó như màu sắc thanh tint, tiêu đề, vv - Jaydip
Không liên quan đến câu hỏi này nhưng bạn có thể tìm câu trả lời ở đây stackoverflow.com/questions/26008536/… - Tal Zion


Bạn có thể sử dụng:

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

Trở lại (tôi nghĩ):

[self.navigationController popToRootViewControllerAnimated:YES];

22
2018-04-06 20:01



Cảm ơn bạn, cách tốt nhất để làm điều đó nếu bạn đã có một thiết kế bộ điều hướng trong bảng phân cảnh của bạn. Bạn đã giúp tôi rất nhiều - phyzalis
quay lại là [self.navigationController popViewControllerAnimated: YES]; popToRoot - chuyển tất cả trở lại chế độ xem điều khiển thứ nhất - Boris Gafurov


Tôi đã có cùng một vấn đề trên ios7. Tôi gọi nó trong bộ chọn và nó hoạt động trên cả ios7 và ios8.

[self performSelector: @selector(showMainView) withObject: nil afterDelay: 0.0];

- (void) showMainView {
    HomeViewController * homeview = [
        [HomeViewController alloc] initWithNibName: @
        "HomeViewController"
        bundle: nil];
    UINavigationController * navcont = [
        [UINavigationController alloc] initWithRootViewController: homeview];
    navcont.navigationBar.tintColor = [UIColor whiteColor];
    navcont.navigationBar.barTintColor = App_Theme_Color;
    [navcont.navigationBar
    setTitleTextAttributes: @ {
        NSForegroundColorAttributeName: [UIColor whiteColor]
    }];
    navcont.modalPresentationStyle = UIModalPresentationFullScreen;
    navcont.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
    [self.navigationController presentViewController: navcont animated: YES completion: ^ {

    }];
}

2
2018-06-29 16:30





Tất cả [self.navigationController pushViewController:controller animated:YES]; không animate một quá trình chuyển đổi, và thêm nó vào ngăn xếp điều khiển chuyển hướng, và một số chất liệu hoạt hình thanh điều hướng mát mẻ khác. Nếu bạn không quan tâm đến hoạt hình của thanh, thì mã này Nên công việc. Thanh này xuất hiện trên bộ điều khiển mới và bạn sẽ nhận được một cử chỉ pop tương tác!

//Make Controller
DetailViewController *controller = [[DetailViewController alloc] initWithNibName:nil                                                                                 
                                    bundle:[NSBundle mainBundle]];  
//Customize presentation
controller.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
controller.modalPresentationStyle = UIModalPresentationCurrentContext;

//Present controller
[self presentViewController:controller 
                   animated:YES 
                 completion:nil];
//Add to navigation Controller
[self navigationController].viewControllers = [[self navigationController].viewControllers arrayByAddingObject:controller];
//You can't just [[self navigationController].viewControllers addObject:controller] because viewControllers are for some reason not a mutable array.

Chỉnh sửa: Xin lỗi, presentViewController sẽ điền vào toàn màn hình. Bạn sẽ cần phải thực hiện một chuyển đổi tùy chỉnh, với CGAffineTransform.translation hoặc một cái gì đó, animate bộ điều khiển với quá trình chuyển đổi, sau đó thêm nó vào viewControllers của navigationController.


1
2017-08-21 16:54





Swift 3

        let vc0 : ViewController1 = ViewController1()
        let vc2: NavigationController1 = NavigationController1(rootViewController: vc0)
        self.present(vc2, animated: true, completion: nil)

1
2017-11-04 16:57



Cách thêm nút BACK vào UIViewController được trình bày - zulkarnain shah


Một cách giải quyết

DetailViewController *controller = [[DetailViewController alloc] initWithNibName:nil                                                                                 
                                        bundle:[NSBundle mainBundle]];  

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller];
navController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
navController.modalPresentationStyle = UIModalPresentationCurrentContext;



[self.navigationController presentViewController:navController 
                                        animated:YES 
                                        completion:nil];

0
2018-03-15 18:09





Nếu bạn không đặt thuộc tính modalPresentationStyle (như UIModalPresentationFormSheet), thanh điều hướng sẽ luôn được hiển thị. Để đảm bảo, luôn luôn làm

[[self.navigationController topViewController] presentViewController:vieController 
                                                            animated:YES 
                                                          completion:nil];

Điều này sẽ luôn hiển thị thanh điều hướng.


0
2018-03-15 17:16



Hmm..với tham chiếu cố định cho 'topViewController', tôi vẫn thấy hành vi tương tự. Tôi không nghĩ rằng tôi đang thêm các bộ điều khiển chế độ xem khác vào ngăn xếp điều hướng theo bất kỳ cách đặc biệt nào. - Jonas Gardner