2016-03-16 2 views
0

У меня есть следующий вспомогательный классдействие UIBarbuttonItem не работает на всех

class PDFPreviewHelper { 
    var pdfNavigationController: UINavigationController! 
    func previewButtonPressed(rootViewController: UIViewController) { 
     let pdfViewController = PDFViewController(resource: "final.pdf") 
     pdfNavigationController = UINavigationController(rootViewController: pdfViewController) 

     let backButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Plain, target: self, action: "backButtonPressedInPDF") 
     pdfViewController.navigationItem.setLeftBarButtonItem(backButton, animated: false) 

     rootViewController.presentViewController(pdfNavigationController, animated: true, completion: nil) 
    } 



    func backButtonPressedInPDF() { 
     pdfNavigationController.dismissViewControllerAnimated(true, completion: nil) 
    } 
} 

вызвать функцию в выше вспомогательном классе в моем RootViewController как следующее:

func previewInPdfButtonPressed() { 
    let a = PDFPreviewHelper() 
    a.viewI129InPDF(self) 
} 

Я успешно модально настоящее pdfNavigationController на вершине моего rootViewController, но всякий раз, когда я нажимаю кнопку back, ничего не вызывается. Почему это так? Я установил точку останова в функции backButtonPressedInPDF, и она даже не попала в точку останова.

+0

вы уверены, что вы звоните 'a.viewI129InPDF (Self)' – Johnykutty

+0

@Johnykutty, да, он действительно показывает PDFViewController. – Kahsn

+0

, но в вашем 'PDFPreviewHelper' вы написали' previewButtonPressed' как метод – Johnykutty

ответ

0

Я думаю, что проблема здесь.

let backButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Plain, target: self, action: "backButtonPressedInPDF") 

To:

let backButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Plain, target: self, action: "backButtonPressedInPDF:") 

Я считаю, что проблема как у action: "backButtonPressedInPDF" где недостающее :

Кроме того, изменить свой метод, добавив (sender:AnyObject) также?

func backButtonPressedInPDF(sender:AnyObject) { 
     pdfNavigationController.dismissViewControllerAnimated(true, completion: nil) 
    } 
+0

Нет, это не решает проблему:/ – Kahsn

+0

Обновленный ответ. Я думаю, он должен решить. – jo3birdtalk

+0

Пробовал. Это все еще не работает. – Kahsn

0

Вам нужно назначить leftBarButtonItem к UINavigationController через ниже способом.

pdfViewController.navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Plain, target: self, action: "backButtonPressedInPDF") 
+0

Это то же самое, что и я. – Kahsn

+0

@Kahsn Пожалуйста, проверьте, что вы сделали по-другому! –

+0

Я пробовал ваш, и он тоже не работал. – Kahsn

0

Вопрос заключается в создании временного экземпляра класса PDFPreviewHelper и использовать его, чтобы представить контроллер представления. Не хранить ссылку. Это может быть исправлено двумя способами:

Метод 1: Добавить previewInPdfButtonPressed метод вашего PDFViewController класса. Затем измените реализацию, как показано ниже.

let backButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Plain, target: pdfViewController, action: "backButtonPressedInPDF") 

Метод 2: Вы должны сохранить объект a, пока вы не отмените свой PDFViewController-navigationcontroller. Даже если вы, как это вы получите исключение, как

2016-03-16 15:43:03.140 XXXX[3757:585277] *** NSForwarding: warning: object 0x7ff5eb72be70 of class 'XXXX.PDFPreviewHelper' does not implement methodSignatureForSelector: -- trouble ahead 
Unrecognized selector -[XXXX.PDFPreviewHelper backButtonPressedInPDF] 

Это потому, что вы не подклассов NSObject для PDFPreviewHelper. можно исправить двумя способами,

  1. Сделать PDFPreviewHelper в NSObject подкласс.
  2. Добавить dynamic ключевое слово функции dynamic func previewInPdfButtonPressed() {....}.

Resolution to this issue is well described here

0
func previewInPdfButtonPressed() 
{ 
    let a = PDFPreviewHelper() 
    a.viewI129InPDF(self) 
} 

Проблема a освобождается, когда программа выходит за рамки этой функции.Действие вы нацелены на a конечно не может быть выполнено больше

решение добавить a как свойство viewController