Отклонить Popover ViewController из Tableviewcell в Swift

В моем приложении iOS 8 у меня есть собственный ViewController, который я представляю как Popover. У этого ViewController есть делегат, который получает и отправляет родительскому ViewController щелкнутый индекс во всплывающем окне. Проблема в том, что я не могу отклонить это всплывающее окно после selectRow.

Вот код:

Это метод, который я вызываю, когда хочу показать свое всплывающее окно.

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

}

Вот код 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
    }
}

Спасибо.


person Bellots    schedule 15.05.2015    source источник


Ответы (2)


Я решил сам:

Я проверил, что проблема была не в том, что поповер не закрывался, а в том, что он закрывался, но через разные секунды.

Поэтому я поместил свой вызов об отклонении в основной поток, и это сработало отлично. Вот код:

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

Я хочу поблагодарить вас, Фрэнки, который помог мне найти решение, убрав то, что не должно быть проблемой.

person Bellots    schedule 15.05.2015

Переместите вызов dismissViewControllerAnimated(true, completion: nil) в делегат в конце метода clickedRowAtIndex. Другими словами, представляющий контроллер представления должен вызывать отклоняющий, а не представленный контроллер представления.

Попробуй это:

extension WelcomeViewController: PopupViewControllerDelegate { 
    func rowClickedAtIndex(index: Int) {      
        dismissViewControllerAnimated(true, completion: nil)   
        println(index) 
    } 
}
person Frankie    schedule 15.05.2015
comment
Я пробовал здесь: extension WelcomeViewController: PopupViewControllerDelegate { func rowClickedAtIndex(index: Int) { popup?.dismissViewControllerAnimated(true, завершение: nil) println(index) } } Но это не работает. Он проходит в этом методе, потому что он печатает индекс, но не отклоняет его. - person Bellots; 15.05.2015
comment
Похоже, popup все еще пытается выполнить вызов. WelcomeViewController должен это сделать. dismissViewControllerAnimated(true, completion: nil) - person Frankie; 15.05.2015
comment
Что мне делать по вашему мнению? - person Bellots; 15.05.2015
comment
Это действительно странно: я заметил, что если я нажимаю на строку сразу после того, как она представлена, она работает правильно. Если я подожду секунду или больше, мне придется дважды нажать на строку, чтобы закрыть ее. - person Bellots; 15.05.2015
comment
Вызывается ли rowClickedAtIndex только один или два раза, когда вам нужно дважды нажать на строку? - person Frankie; 16.05.2015
comment
Метод вызывается дважды, на самом деле мой println дважды печатается на моей консоли. - person Bellots; 16.05.2015
comment
Давайте продолжим обсуждение в чате. - person Bellots; 16.05.2015