Отображение всплывающего окна в размере формы

#ios #swift #swift3 #uipopovercontroller

#iOS #swift #swift3 #uipopovercontroller

Вопрос:

В настоящее время я пытаюсь отобразить представление, которое я создал в xib, на своем экране при нажатии кнопки. Я хочу, чтобы это отображалось в стиле формы в середине экрана. Однако на данный момент я просто пытался заставить его отображаться, прежде чем беспокоиться о размещении.

Вот представление, которое я создал в xib введите описание изображения здесь

Я назначил и создал для него класс «CallNowView», который пока выглядит примерно так.

 import Foundation
import UIKit

class CallNowView: UIViewController{
    
    @IBOutlet var btnCancel: UIButton!
    @IBOutlet var btnCall: UIButton!
    
    @IBAction func btnCall_pressed(_ sender: AnyObject) {
    }
    
    @IBAction func btnCancel_pressed(_ sender: AnyObject) {
    }
    
}
  

То, что я пытался сделать в представлении, в котором я хочу, чтобы отображался xib, заключается в следующем

 @IBAction func btnRSRCall_pressed(_ sender: AnyObject) {
        if (callNowView == nil)
        {
            callNowView = CallNowView(nibName: "CallNow", bundle: nil)
        }
        
        if(UIViewController.responds(to: #selector(getter: popoverPresentationController))){
            callNowView.modalPresentationStyle = .formSheet
            callNowView.popoverPresentationController?.sourceView = btnCall;
            callNowView.popoverPresentationController?.sourceRect = btnCall.bounds;
            callNowView.popoverPresentationController?.permittedArrowDirections = .any
        }
    
        else {
            //no support ios7 device, either ipad or iphone
            if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.phone)
            {
                //present standard controller for ios7, iphone,
                self.present(callNowView, animated: true, completion: nil)
            }
            else
            {
                //present s popupcontroller for ios7, ipad
                let popover = UIPopoverController.init(contentViewController: callNowView)
                popover.present(from: btnCall.bounds, in: btnCall, permittedArrowDirections: .any, animated: true)
            }
        }
    }
  

Когда я запускаю код, он выходит из строя в этой строке self.present(callNowView, animated: true, completion: nil) с сообщением об ошибке terminating with uncaught exception of type NSException

Я надеюсь, что кто-нибудь может мне помочь с этим

Комментарии:

1. Вы хотите представить его как всплывающее окно для модальной таблицы форм? Это два разных стиля представления.

2. @Paulw11 на самом деле, теперь, когда вы упомянули об этом, возможно, в этом случае модальный formsheet был бы лучше

Ответ №1:

В вашем xib вы должны установить класс владельца файла в CallNowView, потому что CallNowView является подклассом UIViewController. Затем вы перетаскиваете представление владельца файла в представление IB. Это должно выглядеть как скриншот ниже: введите описание изображения здесь