Как показать pickerView в ipad actionSheet с помощью tabBarItems - PullRequest
0 голосов
/ 20 февраля 2019

Я пытался добавить pickerView в actionSheet в ios и успешно отображал картинки на iPhone, показанные ниже: это на iphone8 и actionSheet работает как положено

этона iPad, а pickerView ничего не отображает

код, который я реализовал, выглядит следующим образом:

class HomeViewController: UIViewController, UITabBarDelegate, UIActionSheetDelegate, UIPickerViewDelegate, UIPickerViewDataSource{
    let CheckInList = ["Site 1","Site 2","Site 3","Site 4"]
    @IBOutlet weak var homeTabBar: UITabBar!
    override func viewDidLoad() {
        super.viewDidLoad()
        homeTabBar.delegate = self;
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return CheckInList.count
    }
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return CheckInList[row]
    }
    func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat {
        return 40
    }
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        UserDefaults.standard.set(CheckInList[row], forKey: "CheckInSelected")
    }
}

так я реализовал код tabBarItem

func tabBar(_ tabBar: UITabBar, didSelect item: UITabBarItem) {
    print(item.title!)
    switch item.title! {
    case "Check in":
        self.checkInAction()
        break
    default:
        break
    }
}

и это моя функция checkInAction:

func checkInAction(){
    let alertView: UIAlertController = UIAlertController(title: "CheckIn", message: "", preferredStyle: .actionSheet)
    let height:NSLayoutConstraint = NSLayoutConstraint(item: alertView.view, attribute: NSLayoutConstraint.Attribute.height, relatedBy: NSLayoutConstraint.Relation.equal, toItem: nil, attribute: NSLayoutConstraint.Attribute.notAnAttribute, multiplier: 1, constant: self.view.frame.height * 0.35)
    alertView.view.addConstraint(height);

    let pickerView: UIPickerView = UIPickerView(frame: CGRect(x: 0, y: 10, width: alertView.view.frame.width - 18, height: height.constant - 60));
    pickerView.delegate = self
    pickerView.dataSource = self

    if let row = CheckInList.firstIndex(of: selected) {
        pickerView.selectRow(row, inComponent: 0, animated: false)
    }
    alertView.view.addSubview(pickerView)

    let action = UIAlertAction(title: "OK", style: .default, handler: nil)
    alertView.addAction(action)

    if let popoverController = alertView.popoverPresentationController {
        popoverController.sourceView = self.view
        popoverController.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0)
        popoverController.permittedArrowDirections = []
    }

    self.present(alertView, animated: true, completion: nil)
}

Мне нужна помощь для решения этой проблемы на ipad.Из своего исследования я знаю, что на ios ipad мы не можем показать лист действий, и мое исследование основано на основной документации и некоторых вспомогательных ссылках.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

это решило мою проблему, просто хотел поделиться решением с товарищами на будущее.

 if let popoverController = alertView.popoverPresentationController {
        popoverController.sourceView = self.view
        popoverController.sourceRect = CGRect(x: self.view.bounds.midX, y: self.view.bounds.midY, width: 0, height: 0)
        popoverController.permittedArrowDirections = []

        height = NSLayoutConstraint(item: alertView.view, attribute: NSLayoutConstraint.Attribute.height, relatedBy: NSLayoutConstraint.Relation.equal, toItem: nil, attribute: NSLayoutConstraint.Attribute.notAnAttribute, multiplier: 1, constant: self.view.frame.height * 0.25)
         pickerView.frame = CGRect(x: 0, y: 10, width: 300, height: height.constant - 60);
    }

Я изменил ширину фрейма окна выбора на 300 и пересчитал высоту в этом popOverController, который исправил мою проблему.

0 голосов
/ 20 февраля 2019

Насколько мне известно, нет проблем с кодом или ipad. Просто вы указали неправильную ширину для UIPickerView

Просто замените ваш код на

 let pickerView: UIPickerView = UIPickerView(frame: CGRect(x: 0, y: 10, width: 270, height: height.constant - 60));

ширина: 270 изменяется в соответствии с вашим требованием, но (ширина 270 x высота 144), который является размером по умолчанию для uialert

enter image description here

при настройке UIPickerView (frame:CGRect (x: 0, y: 10, width: alertView.view.frame.width - 18, height: height.constant - 60));

, что означает, что он начинается с 0 и принимает всю ширину вида (-18) что правильно с точки зрения actionSheet, но не из оповещения.

...