Bagaimana cara mengatur tanda dan meneruskan beberapa nilai dari pengontrol tampilan model Popup saat ini ke Pengontrol Tampilan Utama Tabbar Menggunakan Swift 4.2?

Skenario saya, saya mengalami Tabbar dengan tiga viewcontroller. Di sini, tabbar pertama viewcontroller saya tampilkan tableview. Jika saya mengklik sel tampilan tabel, itu akan menampilkan satu popup yang menampilkan pengontrol tampilan model. Dalam popup ini viewcontroller Saya mempertahankan dua tombol bar batal dan selesai. Jika saya klik selesai Ini akan menutup dan menampilkan tabbar pengontrol tampilan utama. Sementara dismiss kali saya perlu meneruskan beberapa nilai dengan tanda tombol dari pengontrol tampilan popup yang ada ke pengontrol tampilan utama tabbar.

Di sini, di bawah kode viewcontroller pass popup saya (VC 2)

@IBAction func apply_click(_ sender: Any) {
        print("Dimiss Filter")
        dismiss(animated: true, completion: {

            if let navView = self.tabBar?.viewControllers?[0] as? UINavigationController {
                if let secondTab = navView.viewControllers[0] as? HomeViewController {
                    secondTab.selectedIndexFromFirstTab = self.selectedIndex
                    //secondTab.item = self.item
                    secondTab.tfData = "YES"
                }
            }
            self.tabBar?.selectedIndex = 0
        })
    }

Di sini, Tabbar pengontrol tampilan utama code (menerima nilai) (VC 1)

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        print("SELECTED INDEX:\(selectedIndexFromFirstTab)")
        print("RESPONSE:\(tfData)")
    }

Saya tidak menerima nilai, bagaimana mengatasi masalah ini.


person devmikle    schedule 20.02.2019    source sumber


Jawaban (3)


Dari jawaban sebelumnya yang Anda perlukan untuk membuat beberapa perubahan pada kode yang ada jika Anda ingin meneruskan nilai dari tampilan anak Anda ke pengontrol bilah tab utama.

Untuk itu pertama-tama Anda perlu mendeklarasikan suatu metode ke dalam TabBarViewController utama Anda

func tabPressedWithIndex(index: Int, valueToPass: String) {
    print("selected Index: \(index)")
    print("Value from user: \(valueToPass)")
}

Sekarang Anda perlu meneruskan pengontrol bilah tab itu ke tampilan detail Anda dengan metode didSelectRowAt dan itu akan terlihat seperti:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let vc = self.storyboard?.instantiateViewController(withIdentifier: "DetailViewController") as! DetailViewController
    vc.selectedIndex = indexPath.row
    vc.tabBar = self.tabBarController as? TabBarViewController  // Here you need to assign tab bar controller.
    self.present(vc, animated: true, completion: nil)
}

Sekarang hal selanjutnya adalah ketika Anda mengklik tombol pemberhentian dari pengontrol tampilan detail, Anda perlu menambahkan satu baris di bawah self.tabBar?.selectedIndex = 1:

self.tabBar?.tabPressedWithIndex(index: 1, valueToPass: self.userTF.text!)

Sekarang ini akan meneruskan nilai ke pengontrol bilah tab utama dan metode tabPressedWithIndex akan memanggil dan mencetak data Anda di tab utama Anda.

Lihat proyek demo untuk info lebih lanjut.

person Dharmesh Kheni    schedule 20.02.2019
comment
Terima kasih @Dharmesh Kheni - person devmikle; 20.02.2019

Anda dapat mencapainya dengan berbagai cara. Menggunakan blok/penutupan, protokol atau jika Anda menggunakan RxSwift daripada menggunakan properti terkontrol atau menggunakan peristiwa terkontrol. Karena saya tidak bisa mendemonstrasikan semuanya di sini saya akan menulis protokol

Menggunakan Protokol

Langkah 1:

Deklarasikan protokol di pengontrol tampilan modal Anda

@objc protocol ModalViewControllerProtocol {
    func dismiss(with data: String)
}

Langkah 2:

ViewController yang menghadirkan ModalViewController ini membuatnya untuk mengonfirmasi protokol

extension HomeViewController: ModalViewControllerProtocol {
    func dismiss(with data: String) {
        //use the data here
        self.presentedViewController?.dismiss(animated: true, completion: nil)
    }
}

Langkah 3:

Deklarasikan variabel untuk menyimpan referensi delegasi di ModalViewController

weak var delegate: ModalViewControllerProtocol? = nil

Langkah 4:

Di ViewCONtroller Anda yang menyajikan modalViewController pass self sebagai delegasi ke ModalViewController sebelum presentasi

    let modalVC = //...
    modalVC.delegate = self
    self.present(modalVC, animated: true, completion: nil)

Akhirnya di IBAction dari ModalViewController cukup panggil

@IBAction func apply_click(_ sender: Any) {
    self.delegate?.dismiss(with: "your_data_here")
}

Menggunakan Blokir/Penutupan

Langkah 1:

Dalam modal Anda, ViewController mendeklarasikan properti yang menerima blok/penutupan

var completionBlock: (((String) -> ()))? = nil

Langkah 2:

Di ViewController Anda yang menyajikan ModalViewController ini, berikan satu blok sebelum menyajikannya

    let modalVC = //...
    modalVC.completionBlock = {(data) in
        debugPrint(data)
        self.presentedViewController?.dismiss(animated: true, completion: nil)
    }
    self.present(modalVC, animated: true, completion: nil)

Langkah 3:

Terakhir, di ModalViewController IBAction Anda, cukup jalankan blok yang dilewati

    if let block = completionBlock {
        block("your data here")
    }

Semoga ini bisa membantu

person Sandeep Bhandari    schedule 20.02.2019
comment
Terima kasih. Bisakah Anda memperbarui mana yang merupakan pengontrol tampilan utama tabbar dan mana yang merupakan pengontrol tampilan poup. berdasarkan judul saya, itu akan membuat clea @Sandeep Bhandari - person devmikle; 20.02.2019
comment
@devmikle: Saya telah menetapkan bahwa viewController adalah pengontrol tampilan di bilah tab sedangkan modalViewController adalah pengontrol tampilan yang Anda rencanakan untuk disajikan secara modal - person Sandeep Bhandari; 20.02.2019
comment
Maaf. Saya tidak dapat memahaminya. Jika Anda tidak keberatan tolong jelaskan @Sandeep Bhandari - person devmikle; 20.02.2019
comment
@devmikle : Ini adalah jawaban umum yang bisa Anda dapatkan idenya dengan menerapkan skenario Anda - person Sandeep Bhandari; 20.02.2019
comment
@SandeepBhandari Jawaban Sempurna! - person Harjot Singh; 20.02.2019
comment
Tapi pertanyaan saya adalah data pass anak ke orang tua. @Sandeep Bhandari - person devmikle; 20.02.2019
comment
@Sandeep Bhandari Bagaimana jika saya ingin meneruskan blok ke viewcontroller lain yang tidak saya dorong dari viewcontroller ini? bagaimana kita bisa mencapainya? Saya tahu dengan delegasi. - person Harjot Singh; 20.02.2019
comment
@ harjot-singh: Lagi pula, jika Anda bisa mendapatkan referensi ke pengontrol tampilan yang disajikan, meneruskan blok harus mudah :) - person Sandeep Bhandari; 20.02.2019
comment
@Sandeep Bhandari Bisakah Anda melakukannya dengan contoh di edit? aku tidak bisa memikirkannya, apa yang ada di pikiranmu? - person Harjot Singh; 20.02.2019
comment
@ harjot-singh: Tidak pantas untuk menambahkan sesuatu seperti di sini karena di luar konteks pertanyaan ini, harap pertimbangkan untuk menambahkan pertanyaan baru yang akan memberikan konteks pertanyaan Anda yang lebih jelas dan juga akan membuka pertanyaan untuk audiens yang lebih besar dan siapa mengenal seseorang dengan pemahaman yang lebih baik mungkin memberikan jawaban yang lebih baik juga :) - person Sandeep Bhandari; 20.02.2019
comment
@Sandeep Bhandari, tolong jawab secepatnya. stackoverflow.com/questions/54782250/ - person Harjot Singh; 20.02.2019

Inilah solusinya

self.dismiss(animated: true) {
            if let tabController = self.presentingViewController as? UITabBarController {
                if let navController = tabController.selectedViewController as? UINavigationController {
                    if let secondTab = navController.viewControllers.first as? HomeViewController {
                        secondTab.tfData = "YES"
                    }
                } else {
                    if let secondTab = tabController.selectedViewController as? HomeViewController {
                        secondTab.tfData = "YES"
                    }
                }
            }
        }
person Nilesh R Patel    schedule 20.02.2019