Chế độ xem Bộ điều khiển Chế độ xem lồng nhau của iOS bên trong chế độ xem của UIViewController?


88

Thực tiễn lập trình thường không tốt trong iOS có phải là chế độ xem của bộ điều khiển chế độ xem lồng nhau bên trong chế độ xem của UIViewController không? Ví dụ, tôi muốn có một số loại yếu tố tương tác phản hồi lại các thao tác chạm của người dùng, nhưng có lẽ chỉ chiếm 25% màn hình.

Tôi cho rằng tôi sẽ thêm bộ điều khiển chế độ xem lồng nhau này vào UIViewController của mình bằng cách nói điều gì đó như:

[self.view addSubview: nestedViewController.view];

6
Đây là một hướng dẫn đầy đủ với rất nhiều hình ảnh !! stackoverflow.com/a/23403979/294884 Thưởng thức
Fattie

Câu trả lời:


145

Không, đây thường là thiết kế tốt, nó giúp giữ cho bộ điều khiển chế độ xem của bạn ngắn gọn. Tuy nhiên, bạn nên sử dụng mẫu ngăn bộ điều khiển chế độ xem, hãy xem tài liệu sau.

Triển khai Bộ điều khiển Chế độ xem Vùng chứa

Điều này cực kỳ đơn giản để thiết lập bằng cách sử dụng Trình tạo giao diện với Bảng phân cảnh, hãy xem Chế độ xem vùng chứa trong thư viện đối tượng.

Đây là một ví dụ có sẵn trong Bảng phân cảnh. Trong ví dụ này, bạn sẽ có 4 bộ điều khiển chế độ xem, một bộ điều khiển chứa 3 vùng chứa và một bộ điều khiển cho mỗi vùng chứa. Khi bạn trình bày bộ điều khiển bên trái nhất có tất cả các vùng chứa, Bảng phân cảnh sẽ tự động khởi tạo và nhúng bộ điều khiển còn lại 3. Bạn có thể truy cập các bộ điều khiển chế độ xem con này thông qua thuộc childViewControllerstính hoặc có một phương pháp bạn có thể ghi đè prepareForSegue:sender:và nắm bắt các bộ điều khiển chế độ xem đích của segue sắp được gọi. Đây cũng là một điểm tốt để chuyển các thuộc tính cho bộ điều khiển chế độ xem con nếu cần.

nhập mô tả hình ảnh ở đây


40
Làm thế nào "cái quái" bạn làm được điều đó trong bảng phân cảnh ?! đó là một câu hỏi cơ bản .. Tôi không biết câu trả lời cho :) Thở dài - trả lời câu hỏi của chính tôi. Thêm một vùng chứa vào cảnh. Tạo hình cho nó. Sau đó, trên các trường trống của bảng phân cảnh, tạo một UIViewController. Sau đó, nhấp chuột phải và kéo từ vùng chứa đó (trong danh sách Bộ điều hướng hoặc GUI) đến UIViewController mới đó. Từ cửa sổ bật lên, chọn viewDidLoad-nhúng, để bắt đầu. Cảm ơn Chris! :)
Fattie

Nhân tiện, liên kết bị hỏng.
Benjohn

2
@JoeBlow +1 "viewDidLoad-nhúng" Thánh bò: ai mà ngờ được!
Drux

Cảm ơn @ChrisWagner! Đây là một phần quan trọng của câu đố để triển khai kiến ​​trúc MVVM và tránh Massive View Controller / "MVC";)
Rob

54

Tôi đặt mã này trong bộ điều khiển chế độ xem mẹ. Đó là công việc tốt cho tôi.

Mục tiêu C

-(void)viewDidLoad{
     [super viewDidLoad];
     InnerViewController *innerViewController = [self.storyboard instantiateViewControllerWithIdentifier:INNER_VIEW_CONTROLLER];
     [self addChildViewController:innerViewController];
     [self.view addSubview:innerViewController.view];
     [innerViewController didMoveToParentViewController:self];
}

Swift :

 let childViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChildViewController"),
 self.addChildViewController(childViewController)
 self.view.addSubview(childViewController.view)
 childViewController.didMove(toParentViewController: self)

Một tùy chọn khác là sử dụng IB và đặt chế độ xem vùng chứa. UIViewController sẽ tự động hiển thị (XCode 9 trong trường hợp này): nhập mô tả hình ảnh ở đây


2
Đúng! +1. Cảm ơn bạn đã bao gồm câu trả lời cho cách thực hiện việc này theo chương trình :)
C. Tewalt

Tôi vừa kéo và thả chế độ xem từ bộ điều khiển chế độ xem con vào danh sách chế độ xem phụ mẹ.
dimpiax

5

Đây là giải pháp Swift 3 của tôi dựa trên câu trả lời của Nhà phát triển Swift trên FB

 let childViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ChildPageViewController"),
 self.addChildViewController(childViewController)
 self.view.addSubview(childViewController.view)
 childViewController.didMove(toParentViewController: self)
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.