Lập trình quay trở lại ViewContoder trước đó trong Swift


211

Tôi gửi người dùng đến một trang trên một nút bấm. Trang này là một UITableViewControll .

Bây giờ nếu người dùng chạm vào một ô, tôi muốn đẩy anh ta trở lại trang trước.

Tôi nghĩ về một cái gì đó như thế self.performSegue("back")....nhưng đây dường như là một ý tưởng tồi.

Cách chính xác để làm điều đó là gì?


13
self.navestionControll? .popViewControllAnimated (đúng)
Kalpesh 27/2/2015

Câu trả lời:


526

Swift 3:

Nếu bạn muốn quay lại trình điều khiển xem trước đó

_ = navigationController?.popViewController(animated: true)

Nếu bạn muốn quay lại trình điều khiển xem gốc

_ = navigationController?.popToRootViewController(animated: true)

1
Làm cách nào tôi có thể gửi dữ liệu trở lại trước Bộ điều khiển khi ô được gõ? nếu chúng ta đang sử dụng navigationContoder? .popViewControllAnimated (true)
JDDelgado

4
@JDDelgado Đây là cách bạn gửi lại dữ liệu với người dùng, stackoverflow.com/questions/12561735/ợi
Mohamad Kaakati

36
Đối với Swift 3, đó là.popViewController(animated: true)
Sasho

9
Để che giấu mọi cảnh báo:_ = self.navigationController?.popToRootViewController(animated: true)
Andrew K

1
Chúng tôi đang bỏ qua giá trị trả lại; _ = là quy ước trong nhanh chóng cho điều đó.
Andrew K

53

Swift 3 , Swift 4

if movetoroot { 
    navigationController?.popToRootViewController(animated: true)
} else {
    navigationController?.popViewController(animated: true)
}

navigationContoder là tùy chọn vì có thể không có.


@Vyacheslva tôi đang gặp lỗi "sử dụng ngầm định 'seft' khi đóng cửa, sử dụng 'bản thân' để làm cho ngữ nghĩa chụp rõ ràng"
Sandip Subedi

@SandipSubedi sử dụng [weak self]self?.navigationController?.
Vyacheslav

Điều này rất hữu ích Nhưng tôi muốn gửi một số biến với điều hướng Nhưng bây giờ tôi không thể - Tôi đã sử dụng override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let vc = segue.destination as? Nhưng khi tôi sử dụng điều này, tôi không thể sử dụng điều đó
Saeed Rahmatolahi

Làm thế nào để thêm navigationContoder rồi?
dùng25

@ người dùng thêm 25? Ý anh là gì?
Vyacheslav

37

Swift 3

Tôi có thể bị trễ trong câu trả lời nhưng với swift 3 bạn có thể làm theo cách này:

override func viewDidLoad() {
    super.viewDidLoad()

    navigationItem.leftBarButtonItem = UIBarButtonItem(title: "< Back", style: .plain, target: self, action: #selector(backAction))

    // Do any additional setup if required.
}

func backAction(){
    //print("Back Button Clicked")
    dismiss(animated: true, completion: nil)
}

3
Điều đó không 'hoàn toàn' chính xác. Nếu bạn trình bày bộ điều khiển chế độ xem có điều hướng riêng và sau khi bạn đẩy bộ điều khiển chế độ xem, hãy sử dụng phương thức dismiss:đó, nó sẽ không chỉ loại bỏ bộ điều khiển chế độ xem hiện tại mà còn cả bộ điều khiển xem gốc, và đó không phải là những gì được hỏi ở đây.
Ernesto Fernandez

2
Câu hỏi không hỏi người dùng có bộ điều khiển điều hướng không. Đây là câu trả lời đơn giản và tốt nhất cho không có bộ điều khiển điều hướng. Đây thực sự nên là câu trả lời được chấp nhận.
Droid Chris

Cảm ơn Droid - Xin chào ernestofndz, bạn có thể đúng khi nói rằng rootVC cũng sẽ bị loại bỏ, nhưng điều này không xảy ra với tôi, nó chỉ loại bỏ currentVC, tôi đang thêm và xóa các mục theo chương trình, và nó có thể không phải là cách tiếp cận tương tự với các yếu tố thêm bình thường trên bảng phân cảnh .. chính xác sự hiểu biết của tôi nếu tôi sai ... đối với bảng Xem nếu người dùng cần chuyển chi tiết sang Chế độ xem khác thì đây là trường hợp khác và không có liên kết đến những gì tôi đã đăng và sẽ đồng ý 100% với bạn..những gì tôi hiểu là cần phải có nút Quay lại trong trường hợp này :)
Fullpower

có lẽ bạn có thể thêm một chút giới thiệu .. bởi vì tồn tại loại bỏ & navigationContoder? .popViewControll
marlonpya

dismiss(animated: true, completion: nil)không hoạt động sau khi luân chuyển!
user924

31

Swift 4

Có hai cách để quay lại / quay lại ViewContoder trước đó:

  1. Trường hợp đầu tiên : nếu bạn đã sử dụng: self.navigationController?.pushViewController(yourViewController, animated: true) trong trường hợp này bạn cần sử dụngself.navigationController?.popViewController(animated: true)
  2. Trường hợp thứ hai : nếu bạn đã sử dụng: self.present(yourViewController, animated: true, completion: nil) trong trường hợp này bạn cần sử dụngself.dismiss(animated: true, completion: nil)

Trong trường hợp đầu tiên, hãy chắc chắn rằng bạn đã nhúng ViewContoder của mình vào navigationContoder trong bảng phân cảnh của bạn


19

Trong trường hợp bạn trình bày một UIViewControllertừ trong một UIViewControllernghĩa là ..

// Main View Controller
self.present(otherViewController, animated: true)

Chỉ cần gọi dismisshàm:

// Other View Controller
self.dismiss(animated: true)

self.dismiss(animated: true)- không hoạt động sau khi xoay
user924

17

nhanh 5 trở lên

trường hợp 1: sử dụng với bộ điều khiển Điều hướng

self.navigationController?.popViewController(animated: true)

trường hợp 2: sử dụng với bộ điều khiển xem hiện tại

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

11

Nếu Segue là Loại 'Hiển thị' hoặc 'Đẩy' thì bạn có thể gọi "popViewControll (hoạt hình: Bool)" trên Instance của UINavestionControll. Hoặc nếu segue là loại "hiện tại" thì hãy gọi "notify (hoạt hình: Bool, hoàn thành: (() -> Void)?)" Với phiên bản của UIViewControll


7

cho swift 3 bạn chỉ cần viết dòng mã sau

_ = navigationController?.popViewController(animated: true)

2

Hãy thử điều này: cho chế độ xem trước, sử dụng điều này:

navigationController?.popViewController(animated: true)  

pop để root sử dụng mã này:

navigationController?.popToRootViewController(animated: true) 

2

Swift 4.0 Xcode 10.0 với TabViewControll như chế độ xem cuối cùng

Nếu ViewContoder cuối cùng của bạn được nhúng trong TabViewContaptor, đoạn mã dưới đây sẽ gửi bạn đến thư mục gốc ...

navigationController?.popToRootViewController(animated: true)
navigationController?.popViewController(animated: true)

Nhưng nếu bạn thực sự muốn quay lại chế độ xem cuối cùng (Đó có thể là chế độ xem Tab1, Tab2 hoặc Tab3 ..), bạn phải viết mã dưới đây:

_ = self.navigationController?.popViewController(animated: true)

Điều này hoạt động với tôi, tôi đã sử dụng chế độ xem sau một trong các TabView của mình :)


1

Đối với các câu hỏi liên quan đến cách nhúng viewContoder của bạn vào navigationContoder trong bảng phân cảnh:

  1. Mở bảng phân cảnh của bạn nơi đặt viewContoder khác nhau của bạn
  2. Nhấn vào viewContoder mà bạn muốn bộ điều khiển điều hướng của mình bắt đầu từ
  3. Trên đầu Xcode, chạm vào "Trình chỉnh sửa"
  4. -> Nhấn vào nhúng
  5. -> Nhấn "Bộ điều khiển điều hướng

1

Cái này hoạt động với tôi (Swift UI)

struct DetailView: View {
@Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>

  var body: some View {
      VStack {
        Text("This is the detail view")
        Button(action: {
          self.presentationMode.wrappedValue.dismiss()
        }) {
          Text("Back")
        }
      }
    }
}

0

Tôi đã làm nó như thế này

func showAlert() {
    let alert = UIAlertController(title: "Thanks!", message: "We'll get back to you as soon as posible.", preferredStyle: .alert)

    alert.addAction(UIAlertAction(title: "OK", style: .default, handler: { action in
        self.dismissView()
    }))

    self.present(alert, animated: true)
}

func dismissView() {
    navigationController?.popViewController(animated: true)
    dismiss(animated: true, completion: nil)
}

0

Tôi muốn đề xuất một cách tiếp cận khác cho vấn đề này. Thay vì sử dụng bộ điều khiển điều hướng để bật bộ điều khiển xem, hãy sử dụng các khoảng cách thư giãn. Giải pháp này có một vài ưu điểm nhưng thực sự quan trọng:

  1. Bộ điều khiển gốc có thể quay trở lại bất kỳ bộ điều khiển đích nào khác (không chỉ bộ điều khiển trước) mà không biết gì về đích.
  2. Phân biệt đẩy và pop được xác định trong bảng phân cảnh, do đó không có mã điều hướng trong bộ điều khiển xem của bạn.

Bạn có thể tìm thêm thông tin chi tiết trong từng bước phân đoạn . Cách giải thích tốt hơn trong liên kết cũ, bao gồm cách gửi dữ liệu trở lại, nhưng ở đây tôi sẽ giải thích ngắn gọn.

1) Đi đến bộ điều khiển xem đích (không phải gốc) và thêm một khoảng cách thư giãn:

    @IBAction func unwindToContact(_ unwindSegue: UIStoryboardSegue) {
        //let sourceViewController = unwindSegue.source
        // Use data from the view controller which initiated the unwind segue
    }

2) CTRL kéo từ bộ điều khiển xem bản thân để biểu tượng xuất cảnh trong bộ điều khiển xem xuất xứ:

Thư giãn từ bộ điều khiển xem

3) Chọn chức năng thư giãn bạn vừa tạo vài phút trước:

Chọn chức năng thư giãn

4) Chọn segue thư giãn và đặt tên cho nó:

Đặt tên segue thư giãn

5) Đi đến bất kỳ nơi nào của bộ điều khiển xem gốc và gọi segue thư giãn:

performSegue(withIdentifier: "unwindToContact", sender: self)

Tôi đã tìm thấy cách tiếp cận này hoàn trả rất nhiều khi điều hướng của bạn bắt đầu trở nên phức tạp.

Tôi hi vọng điêu nay se giup được ai đo.


-3

Tôi có thể chuyển hướng đến trang gốc bằng cách viết mã trong "viewDidDisappear" của bộ điều khiển điều hướng,

override func viewDidDisappear(_ animated: Bool) { self.navigationController?.popToRootViewController(animated: true) }


Điều này làm cho bộ điều khiển điều hướng bật lên gốc, ngay cả khi bạn muốn tiến về phía trước trong hệ thống phân cấp.
bkSwifty
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.