Swift 3:按钮在添加为子视图的控制器上不起作用

Swift 3: Buttons not working on controller added as subview

我最近升级到 Xcode 8.0/Swift 3.

我正在添加一个控制器来选择图像作为另一个控制器的子视图,但由于某种原因,添加为子视图的控制器上的按钮不起作用。以前没问题。

代码如下:

let pickerController = DKImagePickerController()


 override func viewDidLoad() {
    super.viewDidLoad()

    pickerController.defaultSelectedAssets = self.assets

    pickerController.didSelectAssets = { (assets: [DKAsset]) in
        print("didSelectAssets")
    }

    self.addChildViewController(pickerController)
    self.view.addSubview(pickerController.view)
    pickerController.didMove(toParentViewController: self)
}

有什么想法吗?我找到的所有答案都表明这应该有效:(

回调 (didSelectAssets) 工作发现如果我只是使用

呈现 pickerController
self.present(pickerController, animated: true) {}

您可以使用方法 ViewWillAppear() 或 viewDidAppear() 而不是 viewDidLoad()

override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
    pickerController.defaultSelectedAssets = self.assets

    pickerController.didSelectAssets = { (assets: [DKAsset]) in
        print("didSelectAssets")
    }

    self.addChildViewController(pickerController)
    self.view.addSubview(pickerController.view)
    pickerController.didMove(toParentViewController: self)
}

您应该检查您的选择器框架。尝试添加它 clipToBounds = true 以检查是否显示整个视图。

DKImagePickerController 似乎仅设计用于呈现 作为视图控制器,而不是作为子 VC 和子视图添加到当前视图。所以,因为你没有呈现它,它无法进行回调。

如果这是您想要的显示方式,您需要对 DKImagePickerController 本身进行一些编辑。

DKImagePickerController.swift 中的 done() 函数更改为以下内容的快速测试:

open func done() {

    if self.presentingViewController == nil {
        self.didSelectAssets?(self.selectedAssets)
    }
    else
    {

        self.presentingViewController?.dismiss(animated: true, completion: {
            self.didSelectAssets?(self.selectedAssets)
        })

    }
}

将调用您的回调函数:

pickerController.didSelectAssets = { (assets: [DKAsset]) in
    print("didSelectAssets")
}

但是,从那里开始,您必须自己编写代码来删除子视图、处理选择等。您可能还需要修改 DKImagePickerController 中的其他一些函数 - 我刚刚做了一个快速测试以使回调正常工作。