UIBarbuttonItem动作根本不起作用

时间:2016-03-16 05:53:18

标签: ios swift 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中的上面的helper类中调用了一个函数,如下所示:

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

我在pdfNavigationController之上成功地模仿rootViewController,但每当按back按钮时,都不会调用任何内容。为什么会这样?我在backButtonPressedInPDF函数中设置了一个断点,它甚至没有达到断点。

4 个答案:

答案 0 :(得分:0)

我认为问题出在这里。

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

要:

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

答案 1 :(得分:0)

您需要通过以下方式将leftBarButtonItem分配给UINavigationController

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

答案 2 :(得分: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. 添加dynamicdynamic func previewInPdfButtonPressed() {....}
  3. 这样的函数的关键字

    Resolution to this issue is well described here

答案 3 :(得分:0)

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

当程序超出此功能的范围时,问题是a被释放。您在a上定位的操作当然不能再执行

解决方案添加a作为viewController

的属性