9

Tôi đang cố gắng chuyển đổi giữa hai trẻ em View Controllers trên một số Container View cụ thể. Tôi có một Navigation Controller với một menu (Table View để thực hiện các tùy chọn khác nhau của trình đơn).Làm cách nào để chuyển đổi giữa hai bộ điều khiển Chế độ xem con trên Swift?

Mỗi lần tôi bấm vào một tùy chọn của menu tôi muốn thay đổi con của Container View nhưng tôi nhận con trên Navigation barTable View (chúng không được hiển thị nhưng chúng nằm trong bộ điều khiển Xem con mới).

Đề án của Main.storyboard của tôi là như thế này:

Navigation Controller --> View Controller (With 2 Container View, 1 for Table View 
              and the other to set master View Controller) 
             | 
             | 
           ------------------------ 
           |      | 
          View Controller  Table View 
          (id: master) 

        View Controller (id: Home) View Controller (id: screen2) 

Tôi có đoạn mã sau vào tableView chức năng (trong đó tôi phát hiện khi một tùy chọn của menu được nhấp) để thay đổi con View Controller Chế độ xem vùng chứa:

let currentController = self.navigationController?.visibleViewController //container 

var oldChild = (currentController?.childViewControllers.last!)! as UIViewController //master 
let newChild = (storyboard?.instantiateViewControllerWithIdentifier("Home"))! as UIViewController //Home 

if (oldChild != newChild){ 
    if currentController.childViewControllers.last != nil{ 
     oldChild.willMoveToParentViewController(nil) 
     currentController.navigationController?.navigationBar.willRemoveSubview(oldChild.view) 
     //oldChild.view.removeFromSuperview() 
     oldChild.removeFromParentViewController() 
    } 

    currentController.addChildViewController(newChild) 
    currentController.view.addSubview(newChild.view) 
    newChild.didMoveToParentViewController(currentController) 
} 

Mã này hoạt động gần như tốt. Vấn đề là Bộ điều khiển Xem con mới được hiển thị phía trên thanh Điều hướng và Chế độ xem Bảng (trình đơn). Vì vậy, nó chiếm toàn bộ màn hình thay vì phù hợp trên Chế độ xem vùng chứa.

Tôi có nên thêm nội dung nào đó vào mã của mình hay tôi đang sử dụng mã của mình theo cách sai? Tôi đã tìm kiếm rất nhiều về nó nhưng hầu hết các giải pháp là trong mục tiêu-c hoặc không làm việc cho tôi.

EDIT: Sau khi tìm kiếm rất nhiều giờ tôi nghi ngờ rằng nó là một cái gì đó liên quan với segue embeded kết nối gốc View Controller với master View Controller nhưng tôi không thể nhúng đứa trẻ mới đến Container View. Mã mà tôi đang cố gắng là:

currentController.performSegueWithIdentifier("EmbedSegue", sender: newChild) 

hoặc

currentController.presentViewController(newChild, animated: true, completion: nil) 

nhưng không ai trong số họ nhúng segue. Chỉ cần hiển thị newChild trên toàn màn hình.

Cảm ơn trước!

+0

Bạn đã thêm chế độ xem VCC vào chế độ xem VC hiện tại chưa? – Horst

+0

Tôi hy vọng bạn đọc điều này: https://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/ImplementingaContainerViewController.html - nó có mọi thứ bạn cần với các ví dụ mã rõ ràng. – Losiowaty

+0

@Losiowaty Tôi đã xem trang này trước đây nhưng tôi đã đóng nó bởi vì nó không nhìn Swift mà tôi đang sử dụng. Tôi hoàn toàn mới nên có lẽ tôi đã sai và tôi có thể sử dụng cả hai cùng một lúc. Hãy sửa tôi nếu tôi sai. –

Trả lời

3

Bạn nên có IBOutlet cho ContainerView và addSubview để IBOutlet này

currentController.containerView.addSubview(newChild.view) 

hoặc

currentController.addSubview(childView.view, toView: self.containerView) 
+0

Cảm ơn bạn rất nhiều! Câu đầu tiên của bạn là đầu mối! Tôi cảm thấy tôi đã bị mắc kẹt vào một bức tường bởi vì tôi nghĩ rằng đó là một cái gì đó liên quan về segue và nó là một cái gì đó về container, mặc dù. –

0

Ngay trước khi bạn gọi currentController .addChildViewController(newChild), hãy thử này:

newChild.modalPresentationStyle = .CurrentContext 

này nên hiển thị các điều khiển newChild xem trong giới hạn của cái nhìn chứa của bạn thay vì toàn màn hình.

+0

Cảm ơn bạn đã trả lời nhưng nó cũng được hiển thị trên toàn màn hình. Tôi đoán nó có thể là một cái gì đó về segue nhúng nhưng tôi không thể có được nó được nêu ra. Nhìn vào bản chỉnh sửa của tôi để xem những gì tôi đã thử. –

0

Bạn không muốn sử dụng presentViewController và tôi không nghĩ rằng bằng cách sử dụng một segue là đúng, hoặc, những người sẽ gây ra bao gồm toàn màn hình.

Tôi nghĩ bạn đang đi đúng hướng, bạn có cần chế độ xem hoặc chế độ xem không?

Đối với UIViews, bạn có thể dễ dàng chỉ hiển thị chế độ xem với giá trị bạn muốn và sau đó thay thế chế độ xem vùng chứa bằng chế độ xem mới, bạn cũng có thể tải UIView cho cảnh xib hoặc bảng phân cảnh.

Đối với UIViewControllers, tôi đoán nếu bạn có logic cụ thể trong họ xem các phương pháp vòng đời, bạn cần thêm chúng làm trình kiểm soát xem con và một lần nữa thay thế khung nhìn container bằng viewController.view.

Cuối cùng, bạn chỉ kích hoạt logic trong phương thức didselectrowatindexpath của mình. Chỉ cần thử một ví dụ cơ bản, tạo UIView với màu nền cam và làm self.containerView = orangeView.

Hãy cho tôi biết nếu điều này không rõ ràng và tôi rất sẵn lòng cung cấp các ví dụ mã nếu cần.

0
//set off the viewcontroller UNDERTOPBAR property off. your VC will load in currentControllers view. you need to set the frame of the view that your are going to load. 

currentController.addChildViewController(newChild) 
newChild.view.frame = CGRectMake(self.currentController.bounds.origin.x, self.currentController.bounds.origin.y, self.currentController.bounds.size.width, self.currentController.bounds.size.height) 
currentController.view.addSubview(newChild.view) 
newChild.didMoveToParentViewController(currentController) 
0

Make ổ cắm của container và thêm bộ điều khiển con mình như thế: self.addSubview(self.currentViewController!.view, toView: self.containerView)

Nó có thể giúp bạn.

0

Câu hỏi được trả lời nhưng như tôi thấy trong mã của bạn, tôi khuyên bạn nên ghim cạnh của childview vào chế độ xem của cha mẹ. Như bên dưới:

child.view.translatesAutoresizingMaskIntoConstraints = false 
    child.view.topAnchor.constraint(equalTo: parent.view.topAnchor).isActive = true 
    child.view.bottomAnchor.constraint(equalTo: parent.view.bottomAnchor).isActive = true 
    child.view.leadingAnchor.constraint(equalTo: parent.view.leadingAnchor).isActive = true 
    child.view.trailingAnchor.constraint(equalTo: parent.view.trailingAnchor).isActive = true 
Các vấn đề liên quan