2016-10-27 23 views
0

これはUIViewControllerです。これは.popoverと表示されています。ポップオーバーコントローラが破棄されない

func editSlotPopOver(eventCell:EventCell, gr:UITapGestureRecognizer){ 

    let location = gr.location(in: eventCell) 
    let editAlertController = UIViewController() 

    let viewAlert = EditSlotPopOver(frame: CGRect(x: 0, y: 0, width:editAlertController.view.bounds.width , height: editAlertController.view.bounds.height)) 
    viewAlert.delegate = self 
    viewAlert.setEvent(event: eventCell.event!, cell: eventCell) 
    editAlertController.view = viewAlert 
    editAlertController.modalPresentationStyle = .popover 
    let popoverMenuViewController:UIPopoverPresentationController = editAlertController.popoverPresentationController! 
    popoverMenuViewController.permittedArrowDirections = .any 
    editAlertController.popoverPresentationController?.delegate = self 
    popoverMenuViewController.sourceView = eventCell 
    popoverMenuViewController.sourceRect = CGRect(
     x: location.x, 
     y: location.y, 
     width: 1, 
     height: 1) 

    present(editAlertController, animated: true, completion: nil) 

} 

予想通りポップオーバーが提示されています

enter image description here

しかし、私はこの方法でセルを削除しようとすると:

func deleteSlot(eventCell: EventCell, id: Int){ 

    let application = UIApplication.shared.delegate as! AppDelegate 
    let id:Int32 = Int32(eventCell.eventId!) 
    print(id) 
    let context = application.managedObjectContext 
    let fetchRequest:NSFetchRequest<Slot> = NSFetchRequest(entityName: "Slot") 
    fetchRequest.predicate = NSPredicate(format: "event_id = %d", id) 

    do { 
     let result = try context.fetch(fetchRequest) 

     let slot = result[0] 
     application.managedObjectContext.delete(slot) 
     do{ 
      try context.save() 
     }catch let err { 
      print(err) 

     } 
    }catch let error { 

     print(error) 

    } 
    //DISMISS DOESN'T WORK HERE 
    self.editAlertController?.dismiss(animated: true, completion: nil) 
    eventCell.removeFromSuperview() 
    self.calendarView.forceReload(reloadEvent: true) 
} 

細胞はスーパービューから削除されますオブジェクトがコアデータから削除されましたが、私はポップオーバーを却下することができません:

enter image description here

2つの機能しかしEditSlorPopOverEditSlotDelegate命名プロトコルのUIViewのサブクラスは、同じコントローラで宣言されています。デリゲートが呼び出されていますが、ポップオーバーは破棄されていません。

selfはなくself.editAlertControllerに却下呼び出してみますコメントから移動

protocol EditSlotDelegate { 
    func deleteSlot(eventCell: EventCell, id: Int) 
} 


class EditSlotPopOver: UIView { 

    override init(frame: CGRect) { 
    super.init(frame: frame) 
    setUpEditButton() 
    editButton.addTarget(self, action: #selector(deleteSlot), for: .touchUpInside) 

} 

//.....more code here 

    func deleteSlot(){ 
    delegate?.deleteSlot(eventCell: eventCell!, id: Int(slotid!)) 

} 

//.....more code here 


} 
+0

@Rajat最新の質問 – mat

+0

「self.editAlertController」ではなく「self」でdismissを呼び出してみてください。ポップオーバーがそれを却下するのではなく、それを却下すべきポップオーバーを提示するコントローラーでなければなりません。 – dlbuckley

+0

@dlbuckleyああ私の神!私はそれがとても簡単なものだとは信じられません。それは問題を解決しました。私はそれを受け入れることができるように答えることができますか?どうもありがとう ! – mat

答えて

0

。ポップオーバーがそれを却下するのではなく、それを却下すべきポップオーバーを提示するコントローラーでなければなりません。

関連する問題