2016-02-14 4 views
0

Я пишу программу стиля «ноутбук». Ноутбуки имеют несколько страниц, и я пытаюсь добавить «перейти на страницу», чтобы пользователь мог перейти к любому . стр поповер представляет CollectionView миниатюр каждой страницы Очевидно, что было бы здорово:.Как «ждать», когда PopoverPresentationController будет уволен

  1. Нажмите на нужной странице миниатюре в пироге
  2. Отправьте selectedPage с помощью делегата
  3. Есть дисплей mainViewController получателя selectedPage

Popover отлично работает. Выбор страницы работает и передает выбранную страницу назад.

Проблема в том, что мне нужно, чтобы mainViewController «подождал», чтобы пользователь мог выбрать страницу. Здесь соответствующие разделы кода в mainViewController:

Пользователь выбирает barButton показать поповер:

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

// переход к поповер

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, но я не могу понять это. Надеюсь, что это достаточно ясно. Он очень рано утром ...

Вот код пирога:

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 
} 

} 

ответ

0

Это типичный пример асинхронного программирования. В этом случае ожидаемое событие async - это ответ пользователя.

Почти универсальный ответ «не ждите». Отправьте сообщение и сообщите об этом событию, когда это будет сделано ».

Что я хотел бы сделать, это создать пользовательский подкласс UIViewController в качестве вашего popover и либо предоставить popover свойство завершения (закрытия), либо установить его с помощью делегата, и определить протокол, чтобы popover мог уведомлять это делегировать, когда пользователь выбирает параметр. (Эти два подхода довольно схожи, но с блоком завершения вам не нужно определять метод, который вызывается - вы просто передаете код завершения при вызове, который вызывает popover.)

+0

Спасибо Duncan, это то, что я подумал, но вы могли бы дать немного более конкретную информацию. Или, может быть, указать мне хороший учебник по асинхронному программированию в быстром. Как относительный новичок, я нахожу асинхронное программирование очень запутанным. Я уже сделал popover специальным подклассом (и добавил его к исходному сообщению). –

+0

Вы уже настроили делегата в своем контроллере просмотра и разработали протокол 'PageCollectionViewControllerDelegate'. Вы там на 90%. Теперь просто реализуйте метод 'selectsPage' в контроллере представления, который вызывает popover. Переместите строку, которая устанавливает imageView.image внутри тела метода 'selectsPage', и вы должны сделать это. –

+0

Да. Вы были абсолютно правы. Я просто подумал об этом. Благодарю. Так просто, но ... –

Смежные вопросы