2016-03-30 2 views
1

У меня есть возможность распечатать документ в основном в моем приложении. Теперь несколько документов не могут быть напечатаны (если не указан критерий). Поэтому я использую делегатов.Возвратите значение Bool из функции после отображения AlertView

Обратите внимание, что я использую смесь как Objective C, так и Swift.

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

if ([self.delegate respondsToSelector:@selector(shouldPrintDocument)]) { 
     BOOL shouldPrint = [self.delegate shouldPrintDocument]; 
     NSLog(@"Should Print %d", shouldPrint); 
     if (shouldPrint){ 
       //We will print here 
     } 
} 

Теперь на Swift стороне вещей, что я в основном нужно сделать, это подтвердить с пользователем, если они хотят, чтобы начать печать документа. Итак, я использую UIAlertController.

Вопрос в том, как вернуть значение bool из этого окна предупреждения.

func shouldPrintDocument() -> Bool { 
    let alertController = UIAlertController(title:"Confirm Print", 
     message: message, 
     preferredStyle: UIAlertControllerStyle.Alert) 

    let cancelAction: UIAlertAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: {(action: UIAlertAction) -> Void in 
     alertController.dismissViewControllerAnimated(true, completion: { _ in }) 
     return false 
    }) 
    alertController.addAction(cancelAction) 
    let ok: UIAlertAction = UIAlertAction(title: "Confirm", style: .Default, handler: {(action: UIAlertAction) -> Void in 
     alertController.dismissViewControllerAnimated(true, completion: { _ in }) 
     //Perform some core data work here, i.e., save a few things and return 
     return true // This is where the issue comes in 
    }) 

    alertController.addAction(ok) 
    self.presentViewController(alertController, animated: true, completion: nil) 
} 
+0

Вы почти наверняка сделать это в затворе. Ваша функция не будет ждать возвращения другого закрытия без блокировки. Он должен вернуться как можно скорее и передать его в завершение. – Dare

+0

@Dare Привет, да, но я не уверен, как это сделать? Не могли бы вы указать мне в правильном направлении? –

+0

Вы можете использовать функцию делегирования таблицы действий, откуда вы можете получить возвращаемые значения –

ответ

0

Вы не возвращаете bool из вида предупреждения. Ваш «ok» обработчик UIAlertAction - это место, где вы должны предпринять соответствующие действия. Проверьте, должен ли документ печататься, а затем распечатывать его. Или вызовите метод оттуда, который сделает это. Но сделайте это изнутри обработчика. Обработчик является блоком кода, где вы в настоящее время комментарий «// Выполняют некоторые основную работу данных ...»

+0

Параметры печати документа находятся в отдельном классе просмотра PDF, поэтому я стараюсь не перемещать свой код основных данных. Когда кнопка печати нажата, этот класс PDF просит своего делегата, если все в порядке, и все будет в порядке. Вот почему я использую этот подход. –

+0

Это не имеет ничего общего с Core Data. Вы просите пользователя подтвердить, печатать ли документ. На экране сидит предупреждение, кто знает, как долго он ждет ответа. Когда пользователь нажимает «Подтвердить», ваш обработчик получает вызов. Это подходящее место, чтобы проверить, можно ли распечатать документ и запустить печать. Вам не нужно ничего перемещать, просто вызовите класс просмотра PDF из обработчика. Вы можете вызвать Objective-C из Swift. –

0

Попробуйте это:

var isprint:BOOL = false 

func shouldPrintDocument() -> Bool { 
let alertController = UIAlertController(title:"Confirm Print", 
    message: message, 
    preferredStyle: UIAlertControllerStyle.Alert) 

let cancelAction: UIAlertAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: {(action: UIAlertAction) -> Void in 
    alertController.dismissViewControllerAnimated(true, completion: { _ in }) 
    isprint = false 
}) 
alertController.addAction(cancelAction) 
let ok: UIAlertAction = UIAlertAction(title: "Confirm", style: .Default, handler: {(action: UIAlertAction) -> Void in 
    alertController.dismissViewControllerAnimated(true, completion: { _ in }) 
    //Perform some core data work here, i.e., save a few things and return 
    isprint = true// This is where the issue comes in 
}) 

alertController.addAction(ok) 
self.presentViewController(alertController, animated: true, completion: nil) 
}