Tutup Popover ViewController dari Tableviewcell di Swift

Di aplikasi iOS 8 saya, saya memiliki ViewController khusus yang saya hadirkan sebagai Popover. ViewController ini memiliki delegasi, yang mengambil, dan mengirim ke induk ViewController, indeks yang diklik di popup. Masalahnya adalah saya tidak bisa mengabaikan Popover ini setelah selectRow.

Berikut kodenya:

Ini adalah metode yang saya panggil ketika saya ingin menampilkan Popup saya.

 @IBAction func registerButtonAction(sender: UIButton) {
    popup = self.storyboard!.instantiateViewControllerWithIdentifier("PopupViewController") as? PopupViewController
    popup!.modalPresentationStyle = .Popover
    popup!.preferredContentSize = CGSizeMake(100, 120)
    let popoverMenuViewController = popup!.popoverPresentationController
    popoverMenuViewController?.permittedArrowDirections = .Up
    popoverMenuViewController?.delegate = self
    popoverMenuViewController?.sourceView = sender
    popoverMenuViewController?.sourceRect = CGRect(
        x: sender.frame.size.width/2,
        y: sender.frame.size.height/2,
        width: 1,
        height: 1)
    popup!.delegate = self

    presentViewController(
        popup!,
        animated: true,
        completion: nil)

}

Berikut kode PopupViewController:

protocol PopupViewControllerDelegate
{
    func rowClickedAtIndex(var index : Int)
}

class PopupViewController: MainViewController {

    var delegate : PopupViewControllerDelegate?

    @IBOutlet weak var tableView: UITableView!


    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

extension PopupViewController:UITableViewDelegate{

    func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
        var cell:PopupTableViewCell? = tableView.dequeueReusableCellWithIdentifier("PopupTableViewCell") as? PopupTableViewCell

        if cell == nil {
            cell = PopupTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "PopupTableViewCell")
        }

        return cell
    }

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        if (self.delegate != nil)
        {
            self.delegate!.rowClickedAtIndex(indexPath.row)
            self.dismissViewControllerAnimated(true, completion: nil)
        }

    }

    func numberOfSectionsInTableView(tableView: UITableView?) -> Int {
        return 1
    }

    func tableView(tableView: UITableView!, numberOfRowsInSection section: Int) -> Int{
        return 2
    }
}

Terima kasih.


person Bellots    schedule 15.05.2015    source sumber


Jawaban (2)


Saya menyelesaikannya sendiri:

Saya memeriksa bahwa masalahnya bukan karena popover tidak ditutup, tetapi popover ditutup tetapi setelah beberapa detik.

Jadi saya meletakkan panggilan pemberhentian saya di thread utama dan itu berfungsi dengan sempurna. Berikut kodenya:

extension WelcomeViewController: PopupViewControllerDelegate {
    func rowClickedAtIndex(index: Int) {
        dispatch_async(dispatch_get_main_queue(),{
            self.dismissViewControllerAnimated(true, completion: nil)
            println(index)
        })
    }
}

Saya ingin mengucapkan terima kasih kepada Frankie, yang membantu saya menemukan solusi, menghilangkan apa yang seharusnya tidak menjadi masalah.

person Bellots    schedule 15.05.2015

Pindahkan panggilan dismissViewControllerAnimated(true, completion: nil) Anda ke delegasi di akhir metode clickedRowAtIndex. Dengan kata lain, pengontrol tampilan yang menyajikan harus memanggil pengontrol tampilan yang mengabaikan, bukan pengontrol tampilan yang disajikan.

Coba ini:

extension WelcomeViewController: PopupViewControllerDelegate { 
    func rowClickedAtIndex(index: Int) {      
        dismissViewControllerAnimated(true, completion: nil)   
        println(index) 
    } 
}
person Frankie    schedule 15.05.2015
comment
Saya sudah mencoba di sini: extension WelcomeViewController: PopupViewControllerDelegate { func rowClickedAtIndex(index: Int) { popup?.dismissViewControllerAnimated(true,complete: nil) println(index) } } Tapi tidak berhasil..Itu lolos dalam metode ini karena itu mencetak indeks, tetapi tidak mengabaikannya. - person Bellots; 15.05.2015
comment
Sepertinya popup masih mencoba melakukan panggilan. WelcomeViewController perlu melakukannya. dismissViewControllerAnimated(true, completion: nil) - person Frankie; 15.05.2015
comment
Menurut Anda, apa yang harus saya lakukan? - person Bellots; 15.05.2015
comment
Ini benar-benar aneh: Saya perhatikan bahwa jika saya segera mengetuk baris yang disajikan, itu berfungsi dengan benar. Jika saya menunggu satu detik atau lebih, saya harus mengetuk baris tersebut dua kali untuk menutupnya. - person Bellots; 15.05.2015
comment
Apakah rowClickedAtIndex dipanggil hanya sekali atau dua kali ketika Anda harus mengetuk baris tersebut dua kali? - person Frankie; 16.05.2015
comment
Metode ini dipanggil dua kali, sebenarnya println saya dicetak dua kali di konsol saya - person Bellots; 16.05.2015
comment
Mari kita melanjutkan diskusi ini dalam obrolan. - person Bellots; 16.05.2015