如何"等待'要解除PopoverPresentationController

时间:2016-02-14 13:12:13

标签: ios swift uipopovercontroller

我正在写一本"笔记本"风格方案。笔记本有多个页面,我试图放入"转到页面" popover允许用户转到任何页面。弹出窗口显示每个页面缩略图的集合视图。显然,它会很棒:

  1. 在popover中单击所需的页面缩略图
  2. 通过委托发送selectedPage
  3. 让收件人mainViewController显示selectedPage
  4. popover效果很好。页面选择工作并传回selectedPage。

    问题是我需要有mainViewController"等待"供用户选择页面。这里是mainViewController中相关的代码部分:

    用户选择barButton来显示popover:

    @IBAction func selectPage(sender: UIBarButtonItem) {
    
            self.performSegueWithIdentifier("showPages", sender: self)
    
        //need to wait here for the popover to be dismissed.
    //the next line is executed before segue even appears
    //"while" and delay don't work
    
        imageView.image = currentNotebook.pages[goToPage! - 1] //displays selectedPage (goToPage is set by delegation)
        goToPage = nil
    }
    

    // segue to popover

    case "showPages" :
                let navigationController = segue.destinationViewController as? PageCollectionViewController
    
                    if let vc = navigationController {
                        vc.delegate = self
                        vc.modalInPopover = false
                        vc.preferredContentSize = CGSizeMake(400,100)
                        vc.notebook = self.currentNotebook
                        print("got to show pages")
            }
    

    我怀疑我在selectPage函数中需要某种闭包或处理程序,但我无法弄明白。希望足够清楚。现在是凌晨......

    以下是popover的代码:

    import UIKit
    
    protocol PageCollectionViewControllerDelegate {
    func selectsPage(selectedPage:Int)
    }
    
    class PageCollectionViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate  {
    
    var notebook: Notebook!
    var pageNum: Int!
    var delegate: PageCollectionViewControllerDelegate?
    
    @IBOutlet weak var pageCollectionView: UICollectionView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        self.pencilCollectionView!.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "cell")
    
        // Do any additional setup after loading the view.
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    func numberOfSectionsInCollectionView(pageCollectionView: UICollectionView) -> Int {    
        return 1
    }
    
    
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    
        return notebook.pages.count
    }
    
    func collectionView(pageCollectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
    
        let cell = pageCollectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! PageCollectionViewCell
        let cellImage = notebook.pages[indexPath.row]
        let tempThumb = imageWithImage(cellImage, scaledToFillSize: CGSizeMake(cell.bounds.width, cell.bounds.height)) //create thumbnail of each page
    
        cell.pageThumb.image = tempThumb
        cell.backgroundColor = UIColor.whiteColor()
    
        return cell
    }
    
    func collectionView(pageCollectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
    
        //return page number
    
        if let delegate =  self.delegate {
            pageNum = indexPath.row + 1
            print("page number",pageNum)
    
            delegate.selectsPage(pageNum)
        }
        self.dismissViewControllerAnimated(true, completion: nil) //if you comment this out the popover is  not dismissed when clicking on a cell
    }
    
    
    func imageWithImage(image: UIImage, scaledToFillSize size: CGSize) -> UIImage {
        let scale: CGFloat = max(size.width / image.size.width, size.height / image.size.height)
        let width: CGFloat = image.size.width * scale
        let height: CGFloat = image.size.height * scale
        let imageRect: CGRect = CGRectMake((size.width - width) / 2.0, (size.height - height) / 2.0, width, height)
        UIGraphicsBeginImageContextWithOptions(size, false, 0)
        image.drawInRect(imageRect)
        let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return newImage
    }
    
    }
    

1 个答案:

答案 0 :(得分:1)

这是异步编程的典型示例。在这种情况下,您正在等待的异步事件是用户响应。

几乎普遍的答案是“不要等待。发送消息并让事件在完成后通知您。”

我要做的是创建一个UIViewController的自定义子类作为你的popover,并给popover一个完成块(closure)属性,或者用一个委托设置它,并定义一个协议,以便当用户选择一个选项时,popover可以通知它的委托。 (这两种方法非常相似,但是使用完成块,您不必定义一个被调用的方法 - 当您进行调用弹出窗口的调用时,只需传入完成代码。)