Làm cách nào để loại bỏ ViewContoder trong Swift?


213

Tôi đang cố gắng loại bỏ một ViewContoder nhanh chóng bằng cách gọi dismissViewControllervào mộtIBAction

  @IBAction func cancel(sender: AnyObject) {
    self.dismissViewControllerAnimated(false, completion: nil)
    println("cancel")
}

@IBAction func done(sender: AnyObject) {
    self.dismissViewControllerAnimated(false, completion: nil)
    println("done")
}

hình ảnh ngẫu nhiên của một segue

Tôi có thể thấy thông báo println trong đầu ra giao diện điều khiển nhưng ViewContoder không bao giờ bị loại bỏ. Điều gì có thể là vấn đề?


2
Làm thế nào bạn trình bày bộ điều khiển xem?
dasdom

Tôi đã thực hiện ánh xạ bằng cách đặt một segue - "hiển thị", xem ảnh chụp màn hình đính kèm.
rshankar

4
Cố gắng sử dụng phương thức. Nếu bạn sử dụng tính năng đẩy, bạn nên loại bỏ nó bằng phương thức pop của bộ điều khiển điều hướng.
dasdom

Câu trả lời:


414

Từ hình ảnh của bạn, có vẻ như bạn đã trình bày ViewContoder bằng cách sử dụng đẩy

Cái dismissViewControllerAnimatednày được sử dụng để đóng ViewControllers được trình bày bằng phương thức

Swift 2

navigationController.popViewControllerAnimated(true)

Swift 4

navigationController?.popViewController(animated: true)

dismiss(animated: true, completion: nil)

6
Làm thế nào bạn sẽ làm điều đó cho một segue 'Hiển thị chi tiết'?
MoralCode

2
Dành cho Swift 2.2 navigationContoder! .PopViewControllAnimated (true)
swiftBoy

7
Dành cho Swift 3 navigationContoder! .PopViewControll (hoạt hình: true)
Alex Trott

174

Tôi có một giải pháp cho vấn đề của bạn. Vui lòng thử mã này để loại bỏ trình điều khiển chế độ xem nếu bạn trình bày chế độ xem bằng phương thức:

Swift 3:

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

HOẶC LÀ

Nếu bạn trình bày chế độ xem bằng cách sử dụng "đẩy" segue

self.navigationController?.popViewController(animated: true)

1
Cảm ơn, nhưng vẫn cho kết quả tương tự, nó không loại bỏ ViewContoder
rshankar

4
Điều này khác với phương pháp mà OP đã sử dụng như thế nào?
dasdom

30
Cuộc hội thoại là vô ích nếu bạn không phản ứng với câu hỏi của tôi.
dasdom

_ = self.navestionControll? .popViewCont điều khiển (hoạt hình: đúng)
valexa

19

nếu bạn làm điều này tôi đoán bạn có thể không nhận được thông báo println trong bảng điều khiển,

@IBAction func cancel(sender: AnyObject) {
  if(self.presentingViewController){
    self.dismissViewControllerAnimated(false, completion: nil)
    println("cancel")
   }
}

@IBAction func done(sender: AnyObject) {
  if(self.presentingViewController){
    self.dismissViewControllerAnimated(false, completion: nil)
    println("done")
  }    
}

1
stackoverflow.com/questions/30840235/ trên . Làm ơn giúp tôi với? Tôi bị mắc kẹt trong đó quá lâu, người vẫn không thể tìm ra giải pháp
Thiha Aung

14

Trong Swift 3.0 đến 4.0, dễ dàng như nhập hàm này vào chức năng của bạn:

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

Hoặc nếu bạn đang ở trong bộ điều khiển điều hướng, bạn có thể "bật" nó:

self.navigationController?.popViewController(animated: true)

bỏ qua không hoạt động, bởi vì tôi đang sử dụng PushViewControll. Chỉ self.navestionControll? .PopViewControll (hoạt hình: true) hoạt động.
iOS

13
  1. nhúng Chế độ xem bạn muốn loại bỏ trong NavigationContoder
  2. thêm một BarButton với "Xong" làm Định danh
  3. gọi Trình chỉnh sửa trợ lý với nút Xong được chọn
  4. tạo IBAction cho nút này
  5. thêm dòng này vào ngoặc:

    self.dismissViewControllerAnimated(true, completion: nil)

12

Sử dụng:

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

thay vì:

self.navigationController.dismissViewControllerAnimated(true, completion: nil)

1
thêm một với navigationContoder và nó hoạt động với tôi
Jason G

1
@naturalc: Xin lưu ý rằng nếu navigationContoder không hoạt động và bạn đặt!, ứng dụng sẽ bị sập
jobima

8

Nếu bạn trình bày bộ điều khiển mà không có Bộ điều khiển Điều hướng, bạn có thể gọi mã sau đây từ một phương thức của bộ điều khiển được trình bày.

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

Nếu ViewContoder của bạn được trình bày theo phương thức, thì trình bày tùy chọnViewContaptor sẽ không phải là con số không và mã sẽ được thực thi.


bạn đã cứu ngày của tôi
Shanu Singh

6

Dựa trên kinh nghiệm của tôi, tôi thêm một phương thức để loại bỏ tôi dưới dạng tiện ích mở rộng cho UIViewControll:

extension UIViewController {
    func dismissMe(animated: Bool, completion: (()->())?) {
        var count = 0
        if let c = self.navigationController?.viewControllers.count {
            count = c
        }
        if count > 1 {
            self.navigationController?.popViewController(animated: animated)
            if let handler = completion {
                handler()
            }
        } else {
            dismiss(animated: animated, completion: completion)
        }
    }
}

Sau đó, tôi gọi phương thức này để loại bỏ trình điều khiển xem trong bất kỳ UIViewControllerlớp con nào . Ví dụ: trong hành động hủy:

class MyViewController: UIViewController {
   ...
   @IBAction func cancel(sender: AnyObject) {
     dismissMe(animated: true, completion: nil)
   }
   ...
}

6

Từ tài liệu của Apple :

Trình điều khiển khung nhìn trình bày có trách nhiệm loại bỏ trình điều khiển khung nhìn mà nó đã trình bày

Vì vậy, đó là một thực tế xấu khi chỉ viện dẫn việc sa thải phương thức từ chính nó.

Những gì bạn nên làm nếu bạn trình bày nó theo phương thức là:

presentingViewController?.dismiss(animated: true, completion: nil)

4

Không tạo bất kỳ dấu hiệu nào từ Hủy hoặc Xong sang VC khác và chỉ viết mã này các nút của bạn @IBAction

@IBAction func cancel(sender: AnyObject) {
    dismiss(animated: false, completion: nil)
}

3

Đây là một cách để loại bỏ bộ điều khiển xem hiện tại và quay trở lại bộ điều khiển xem trước đó. Bạn chỉ có thể làm điều này thông qua Storyboard.

  1. Bảng phân cảnh mở
  2. Nhấp chuột phải vào nút Hủy và kéo nó vào trình điều khiển xem trước, nơi bạn muốn quay lại trình điều khiển trước
  3. Bây giờ phát hành nhấp chuột phải và bạn có thể thấy một số hành động thực hiện trên nút hủy
  4. Bây giờ chọn tùy chọn "popover Present" từ danh sách
  5. Bây giờ bạn có thể loại bỏ chế độ xem hiện tại của mình bằng cách nhấp vào nút hủy

Hãy thử nó, nó làm việc với tôi.

Cách thứ hai - Sử dụng - navigationController.popViewControllerAnimated(true)

May mắn nhất..


stackoverflow.com/questions/30840235/ trên . Làm ơn giúp tôi với? Tôi bị mắc kẹt trong đó quá lâu, người vẫn không thể tìm ra giải pháp
Thiha Aung

3
Cái này sai. Bạn không bao giờ bỏ qua chế độ xem mà bạn đang hiển thị trình điều khiển chế độ xem mới trên đầu trang hiện tại, gây rò rỉ bộ nhớ. Điều này rất có thể sẽ khiến ứng dụng của bạn bị từ chối từ cửa hàng ứng dụng.
3366784

2

Để tham khảo, lưu ý rằng bạn có thể loại bỏ trình điều khiển xem sai. Ví dụ: nếu bạn có hộp cảnh báo hoặc phương thức hiển thị trên đầu phương thức khác. (Ví dụ, bạn có thể có cảnh báo bài đăng Twitter hiển thị trên đầu cảnh báo phương thức hiện tại của bạn). Trong trường hợp này, bạn cần gọi loại bỏ hai lần hoặc sử dụng một segue thư giãn.


1

Nếu bạn đang trình bày một ViewContoder một cách vừa phải và muốn quay trở lại ViewContoder gốc, hãy cẩn thận loại bỏ ViewContoder được trình bày này trước khi bạn quay trở lại ViewContoder gốc nếu không ViewContoder này sẽ bị xóa khỏi Bộ nhớ và gây rò rỉ Bộ nhớ.


1

Trong Swift 3.0

Nếu bạn muốn loại bỏ một trình điều khiển xem trình bày

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

1

Trong Swift 4.1 và Xcode 9.4.1

Nếu bạn sử dụng PushViewContaptor để trình bày bộ điều khiển khung nhìn mới, hãy sử dụng cái này

self.navigationController?.popViewController(animated: false)

Một câu trả lời sao chép dán khác
J. Doe

1

Thử cái này:

@IBAction func close() {
  dismiss(animated: true, completion: nil)
}

Phương thức được gọi là "notifyViewContoder" chỉ cần một tham số duy nhất, mà tôi cho rằng sẽ giống như loại bỏ hoạt hình đối với chế độ xem trước đó, đây là giải pháp đơn giản nhất.
cassiodiego

0

Mã này được viết bằng hành động nút để loại bỏ

  @IBAction func cancel(sender: AnyObject) {
   dismiss(animated: true, completion: nil)
  }

1
Mặc dù đoạn mã này có thể giải quyết câu hỏi, bao gồm một lời giải thích thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn.
DimaSan


0

Nếu bạn sử dụng phương thức hiện tại trong VC cha thì bạn nên gọi hàm này, để loại bỏ VC con, hãy sử dụng phương thức này

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

nếu bạn gọi VC con bằng cách sử dụng phương thức đẩy, để loại bỏ VC con sử dụng

self.navigationController?.popViewController(animated: true)
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.