【问题标题】:popover controller not being dismissed弹出框控制器没有被解雇
【发布时间】:2016-10-27 18:40:14
【问题描述】:

我有这个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)

}

弹出框按预期呈现:

但是,当我尝试使用这种方法删除单元格时:

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

单元格已从超级视图中删除,对象已从核心数据中删除,但我无法关闭弹出框:

这 2 个函数在同一个控制器中声明,但是 EditSlorPopOver 是 UIView 的子类,其协议名为 EditSlotDelegate。正在调用委托,但弹出框没有被解除。

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 


}

【问题讨论】:

  • @Rajat 请查看更新后的问题
  • 尝试在'self'而不是self.editAlertController上调用dismiss。应该是呈现弹出框的控制器应该关闭它,而不是弹出框关闭它自己。
  • @dlbuckley 天哪!我不敢相信这是这么容易的事情。这解决了问题。能否请您回答,以便我接受。非常感谢!
  • 没问题,将评论移至答案:)

标签: ios swift uipopovercontroller


【解决方案1】:

从评论中移出:

尝试在self 而不是self.editAlertController 上调用dismiss。应该是呈现弹出框的控制器应该将其关闭,而不是弹出框自行关闭。

【讨论】:

    猜你喜欢
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多