Я пишу программу стиля «ноутбук». Ноутбуки имеют несколько страниц, и я пытаюсь добавить «перейти на страницу», чтобы пользователь мог перейти к любому . стр поповер представляет CollectionView миниатюр каждой страницы Очевидно, что было бы здорово:.Как «ждать», когда PopoverPresentationController будет уволен
- Нажмите на нужной странице миниатюре в пироге
- Отправьте selectedPage с помощью делегата
- Есть дисплей 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
}
}
Спасибо Duncan, это то, что я подумал, но вы могли бы дать немного более конкретную информацию. Или, может быть, указать мне хороший учебник по асинхронному программированию в быстром. Как относительный новичок, я нахожу асинхронное программирование очень запутанным. Я уже сделал popover специальным подклассом (и добавил его к исходному сообщению). –
Вы уже настроили делегата в своем контроллере просмотра и разработали протокол 'PageCollectionViewControllerDelegate'. Вы там на 90%. Теперь просто реализуйте метод 'selectsPage' в контроллере представления, который вызывает popover. Переместите строку, которая устанавливает imageView.image внутри тела метода 'selectsPage', и вы должны сделать это. –
Да. Вы были абсолютно правы. Я просто подумал об этом. Благодарю. Так просто, но ... –