วิธีตั้งค่าสถานะและส่งค่าบางค่าจาก Popup นำเสนอ model viewcontroller ไปยัง Tabbar Main Viewcontroller โดยใช้ Swift 4.2

สถานการณ์ของฉัน ฉันมี Tabbar กับสาม viewcontroller ที่นี่ แถบแท็บก่อน viewcontroller ฉันกำลังแสดง tableview ถ้าฉันคลิกเซลล์ tableview มันจะแสดงป๊อปอัปหนึ่งตัวแสดงตัวควบคุมโมเดล ในป๊อปอัปปัจจุบันนี้ viewcontroller ฉันกำลังรักษาปุ่มแถบสองปุ่มให้ยกเลิกและเสร็จสิ้น ถ้าฉันคลิกเสร็จสิ้น มันจะปิดและแสดง tabbar main view controller ในขณะที่เวลา dismiss ฉันต้องส่งค่าบางค่าด้วยการตั้งค่าสถานะปุ่มจากตัวควบคุมมุมมองป๊อปอัปปัจจุบันไปยังตัวควบคุมมุมมองหลักของแถบแท็บ

ที่นี่ ด้านล่างของฉัน popup ผ่านรหัส viewcontroller (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
        })
    }

ที่นี่ Tabbar ตัวควบคุมมุมมองหลัก code (ค่ารับ) (VC 1)

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

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

ฉันไม่ได้รับค่า วิธีแก้ปัญหานี้


person devmikle    schedule 20.02.2019    source แหล่งที่มา


คำตอบ (3)


จากคำตอบก่อนหน้าของฉันที่คุณต้องการ เพื่อทำการเปลี่ยนแปลงโค้ดที่มีอยู่เล็กน้อยหากคุณต้องการส่งค่าจากมุมมองลูกของคุณไปยังตัวควบคุมแถบแท็บหลัก

ก่อนอื่นคุณต้องประกาศวิธีการลงใน main TabBarViewController ของคุณ

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

ตอนนี้คุณต้องส่งตัวควบคุมแถบแท็บนั้นไปยังมุมมองรายละเอียดของคุณด้วยวิธี didSelectRowAt และมันจะมีลักษณะดังนี้:

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)
}

สิ่งต่อไปคือเมื่อคุณคลิกที่ปุ่มยกเลิกจากตัวควบคุมมุมมองรายละเอียด คุณจะต้องเพิ่มหนึ่งบรรทัดด้านล่าง self.tabBar?.selectedIndex = 1:

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

ตอนนี้จะส่งค่าไปยังตัวควบคุมแถบแท็บหลักและวิธี tabPressedWithIndex จะเรียกและพิมพ์ข้อมูลของคุณในแท็บหลัก

ดูโปรเจ็กต์ สาธิต เพื่อดูข้อมูลเพิ่มเติม

person Dharmesh Kheni    schedule 20.02.2019
comment
ขอบคุณ @Dharmesh Kheni - person devmikle; 20.02.2019

คุณสามารถบรรลุเป้าหมายได้หลายวิธี การใช้บล็อก/การปิด โปรโตคอล หรือหากคุณใช้ RxSwift มากกว่าการใช้คุณสมบัติที่ควบคุมหรือใช้เหตุการณ์ที่มีการควบคุม เพราะฉันไม่สามารถสาธิตทุกสิ่งที่นี่ได้ ฉันจะเขียนโปรโตคอล

การใช้โปรโตคอล

ขั้นตอนที่ 1:

ประกาศโปรโตคอลในตัวควบคุมมุมมองโมดอลของคุณ

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

ขั้นตอนที่ 2:

ViewController ที่นำเสนอ ModalViewController นี้ใช้เพื่อยืนยันโปรโตคอล

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

ขั้นตอนที่ 3:

ประกาศตัวแปรเพื่อเก็บการอ้างอิงผู้รับมอบสิทธิ์ใน ModalViewController

weak var delegate: ModalViewControllerProtocol? = nil

ขั้นตอนที่ 4:

ใน ViewCOntroller ของคุณที่นำเสนอ modalViewController ส่งผ่านตัวเองในฐานะผู้รับมอบสิทธิ์ให้กับ ModalViewController ก่อนที่จะนำเสนอ

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

ในที่สุดใน IBAction ของ ModalViewController เพียงแค่โทร

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

การใช้การบล็อก/การปิด

ขั้นตอนที่ 1:

ใน Modal ViewController ของคุณประกาศคุณสมบัติที่ยอมรับการบล็อก/การปิด

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

ขั้นตอนที่ 2:

ใน ViewController ของคุณที่นำเสนอ ModalViewController นี้ ให้ส่งบล็อกก่อนนำเสนอ

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

ขั้นตอนที่ 3:

ในที่สุดใน ModalViewController IBAction ของคุณเพียงแค่ดำเนินการบล็อกที่ส่งผ่าน

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

หวังว่ามันจะช่วยได้

person Sandeep Bhandari    schedule 20.02.2019
comment
ขอบคุณ คุณช่วยกรุณาอัปเดตอันไหนเป็นตัวควบคุมมุมมองหลักของแถบแท็บและอันไหนเป็นตัวควบคุมมุมมอง poup ตามชื่อของฉัน มันจะทำให้ clea @Sandeep Bhandari - person devmikle; 20.02.2019
comment
@devmikle: ฉันได้ระบุว่า viewController เป็นตัวควบคุมมุมมองในแถบแท็บโดยที่ modalViewController เป็นตัวควบคุมมุมมองที่คุณวางแผนที่จะนำเสนอแบบ modally - person Sandeep Bhandari; 20.02.2019
comment
ขอโทษ. ฉันไม่สามารถเข้าใจได้ หากคุณไม่ว่าอะไร โปรดทำให้ @Sandeep Bhandari ชัดเจน - person devmikle; 20.02.2019
comment
@devmikle: มันเป็นคำตอบทั่วไปที่คุณจะได้รับแนวคิดจากการนำไปประยุกต์ใช้กับสถานการณ์ของคุณ - person Sandeep Bhandari; 20.02.2019
comment
@SandeepBhandari คำตอบที่สมบูรณ์แบบ! - person Harjot Singh; 20.02.2019
comment
แต่คำถามของฉันคือการส่งข้อมูลระหว่างผู้ปกครอง @สันดีป บันดารี - person devmikle; 20.02.2019
comment
@Sandeep Bhandari จะเกิดอะไรขึ้นถ้าฉันต้องการส่งบล็อกไปยังวิวคอนโทรลเลอร์อื่นซึ่งฉันไม่ได้ผลักจากวิวคอนโทรลเลอร์นี้ เราจะบรรลุเป้าหมายนั้นได้อย่างไร? ฉันรู้กับตัวแทน - person Harjot Singh; 20.02.2019
comment
@ harjot-singh: อย่างไรก็ตามหากคุณสามารถรับการอ้างอิงถึงตัวควบคุมมุมมองที่กำลังนำเสนอได้ การผ่านบล็อกควรจะตรงไปตรงมา :) - person Sandeep Bhandari; 20.02.2019
comment
@Sandeep Bhandari คุณช่วยกรุณาทำตัวอย่างในการแก้ไขได้ไหม? ฉันคิดไม่ออก ในใจคุณคิดอะไรอยู่? - person Harjot Singh; 20.02.2019
comment
@ harjot-singh: เป็นการไม่เหมาะสมที่จะเพิ่มอะไรเช่นนี้เนื่องจากไม่สอดคล้องกับบริบทของคำถามนี้ โปรดพิจารณาเพิ่มคำถามใหม่ที่จะให้บริบทที่ชัดเจนยิ่งขึ้นสำหรับคำถามของคุณ และจะเปิดคำถามให้กับผู้ชมจำนวนมากขึ้นและใคร รู้ว่าคนที่มีความเข้าใจดีกว่าอาจให้คำตอบที่ดีกว่าเช่นกัน :) - person Sandeep Bhandari; 20.02.2019
comment
@Sandeep Bhandari โปรดตอบโดยเร็วที่สุด stackoverflow.com/questions/54782250/ - person Harjot Singh; 20.02.2019

นี่คือวิธีแก้ปัญหา

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