2015-07-22 16 views
6

Tôi đang cố gắng hiểu hành vi điều hướng giữa ViewControllers với (và không) bằng cách sử dụng NavigationController và tôi hiểu nhầm một số điều trong khi đọc bài viết và tài liệu nên tôi quyết định hỏi họ.ios - Điều hướng giữa nhiều NavigationControllers

Câu hỏi chính là: Điều gì đã xảy ra nếu chúng tôi có nhiều NavigationControllers trong Storyboard và muốn chuyển từ người này sang người khác? (Và điều này có thể đạt được chỉ bằng cách sử dụng phân đoạn như chúng tôi làm giữa các VC thông thường, tôi có đúng không?)

Như tôi hiểu, NavigationController đại diện cho một chồng ViewControllers trong đó chúng ta có thể bật và đẩy các VC này. Vì vậy, bây giờ chúng tôi thay đổi "vị trí" của chúng tôi từ VC của NavigationController đầu tiên để VC từ thứ hai, những gì sẽ xảy ra tiếp theo? Ngăn xếp đầu tiên biến mất và bây giờ chúng tôi chỉ làm việc trong ngăn xếp thứ hai? Nếu vậy, có nghĩa là các ngăn xếp VC của NavigationController đầu tiên đã bị xóa khỏi bộ nhớ hay không?

Có lẽ tôi hoàn toàn hiểu nhầm điều gì đó hoặc có thể không :). Tôi sẽ rất vui khi thấy câu trả lời của bạn và hy vọng sẽ hỏi bạn những câu hỏi chi tiết hơn về cơ chế điều hướng.

CẬP NHẬT

Điểm có ích là: Hãy nói rằng chúng tôi có một (ban đầu) VC với hai nút tương ứng với hai phần riêng biệt của ứng dụng. Tiếp theo chúng ta bấm vào nút đầu tiên và đi đến RootVC của một NC hơn chúng ta quay trở lại VC ban đầu của chúng tôi nhấn nút thứ hai và đi đến NC khác. Điều gì đã xảy ra với ngăn xếp của NC đầu tiên khi chúng ta quay trở lại VC ban đầu và cách tốt nhất để đi "bên ngoài" NC cho VC ban đầu là gì?

CẬP NHẬT

Tôi đang cố gắng để hiểu những gì xảy ra với bộ nhớ và đó VC đang trong cảnh vào lúc này và vân vân. Có lẽ nó hoàn toàn không quan trọng nếu chúng ta có một số VC bổ sung trong cảnh, có lẽ chúng ta cần chúng để làm cho chuyển đổi giữa NC (hoặc chỉ VC) nhanh hơn. Vì vậy, tôi chỉ muốn hiểu nó hoạt động như thế nào.

Trả lời

4

Hãy tưởng tượng bạn có chuỗi ứng dụng tiêu chuẩn nơi bạn đẩy/bật chế độ xem trong trình điều khiển điều hướng ban đầu. Sau đó, hãy tưởng tượng bạn có cái nhìn khác nhau mà không phải là một phần của chuỗi rằng, giống như hồ sơ người dùng, mà bạn trình bày quan điểm như phương thức:

enter image description here

Bây giờ điều khiển điều hướng trên là ban đầu để bạn bắt đầu từ đây, trong khi để sử dụng một thứ hai, bạn sẽ phải truy cập vào nó thông qua UIStoryboard như thế này (mũi tên màu đỏ):

// Get storyboard 
let storyboard = UIStoryboard(name: name, bundle: NSBundle.mainBundle()) 

// Get profile NC 
let profileNC = storyboard.instantiateViewControllerWithIdentifier("LoginNC") as! UINavigationController 

Nhưng nếu bạn thực sự muốn trình bày hồ sơ từ một phần của ứng dụng vì vậy nó được không modal, bạn cũng có thể làm điều đó (mũi tên màu xanh lá cây).Sự khác biệt duy nhất là bây giờ bạn không cần bộ điều khiển thứ hai - vì vậy bạn không kết nối push segue với NC màu đỏ, nhưng để đăng nhập trực tiếp bộ điều khiển xem. Nếu bạn thực sự cố gắng để kết nối NC - NC và sau đó chạy nó, bạn sẽ nhận được ngoại lệ thời gian chạy nói rằng bạn đã làm nó sai.

Memory

Tất cả các VC nghỉ trong bộ nhớ, bất kể cách bạn thể hiện chúng. Điều này cũng đúng với các chế độ xem nền khi bạn trình bày một cái gì đó như là phương thức. Nếu bạn gặp vấn đề với bộ nhớ do chuỗi dài, bạn có thể triển khai bộ nhớ dọn dẹp/bộ nhớ đệm trong bộ điều khiển của mình:

func viewWillAppear(animated: Bool) { 

    // Call super first 
    super.viewWillAppear(animated) 

    // Prepare UI 
} 

func viewWillDisappear(animated: Bool) { 

    // Call super first 
    super.viewWillAppear(animated) 

    // do some memory cleanup, since view will not be visible atm 
} 

Hy vọng điều đó sẽ hữu ích!

+0

Cảm ơn bạn đã trả lời chi tiết ngay bây giờ nó có ý nghĩa với tôi! Như tôi đã hiểu từ [_Điều khác biệt duy nhất là bây giờ bạn không cần bộ điều khiển thứ hai - vì vậy bạn không kết nối push segue với NC_ đỏ và [_All VC nằm trong bộ nhớ, bất kể bạn trình bày chúng như thế nào.] không cần phải có nhiều NC trong ứng dụng, chúng ta chỉ tạo ra một NC và làm tất cả mọi thứ bên trong nó, đúng không? Bạn có thể đưa ra một ví dụ khi chúng ta cần nhiều NC trong ứng dụng? – Max

+0

Có, nếu bạn chỉ đẩy và bật các VC, một bộ điều khiển điều hướng là đủ. tôi đoán rằng ví dụ tốt nhất về cách sử dụng cho nhiều trình điều khiển điều hướng là khi bạn đã thoát khỏi menu trong ứng dụng thay đổi chế độ xem gốc của bạn (vì vậy bạn đi đến một số danh sách, nhưng cũng liên hệ với biểu mẫu v.v. Sau đó, bạn có nhiều điểm ban đầu mà người dùng tương tác - và bạn sẽ có cùng số lượng NC như vậy :) –

+0

Trong một nhận xét của tôi về @Glorfindel tôi đã nói về một VC (ban đầu) với hai nút đi đến các phần ứng dụng khác nhau (một số loại bảng điều khiển bên trái; D). Trong trường hợp này sau khi đi từ VC ban đầu đến một trong các NC, chúng ta tạo cái cuối cùng như một cái nhìn gốc, tôi có đúng không? Và điều gì xảy ra với những cái khác (ví dụ: khi chúng ta chuyển đổi giữa các NC này)? Và cũng làm thế nào để đi từ VC của một NC đến VC cụ thể trong một NC đúng cách? (chỉ cần sử dụng show segue?) – Max

0

Điều gì có ý nghĩa, là trình bày một UINavigationController mới với bộ điều khiển xem con của nó từ một hiện tại như một hộp thoại phương thức (điều này có thể được thực hiện với một phương thức). Mỗi bộ điều khiển điều hướng có ngăn xếp riêng của nó, và trong khi bạn đang bận trong hộp thoại, ngăn xếp 'chủ' vẫn còn nguyên vẹn. Khi bạn loại bỏ hộp thoại, bạn sẽ quay lại 'chủ'.

Tôi không chắc chắn về mặt kỹ thuật có thể đẩy bộ điều khiển điều hướng lên bộ điều khiển hiện có hay không. Nó không có ý nghĩa, mặc dù.

+0

Khi tôi hiểu nó thêm một NavigationController vào ngăn xếp khác? Tôi không cần một hành vi như vậy (và không thể tưởng tượng nó có thể được sử dụng ở đâu). Vấn đề là: Hãy nói rằng chúng tôi có một (ban đầu) VC với các nút đại diện cho hai phần riêng biệt của ứng dụng. Tiếp theo chúng ta bấm vào nút đầu tiên và đi đến RootVC của một NC hơn chúng ta quay trở lại VC ban đầu của chúng tôi nhấn nút thứ hai và đi đến NC khác. Điều gì đã xảy ra với ngăn xếp của NC đầu tiên khi chúng ta quay trở lại VC ban đầu và cách tốt nhất để đi "bên ngoài" NC cho VC ban đầu là gì? – Max

+0

Tôi đã cập nhật câu hỏi với nhận xét này – Max

+0

Hành vi bạn muốn nhắc tôi về UITabBarController, điều này duy trì một số bộ điều khiển xem con (có thể là bộ điều khiển điều hướng). Trong trường hợp đó, bộ điều khiển thanh tab duy trì trạng thái của mỗi bộ điều khiển điều hướng. – Glorfindel

Các vấn đề liên quan