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

Posted

技术标签:

【中文标题】Swift 3:按钮在控制器上不起作用添加为子视图【英文标题】:Swift 3: Buttons not working on controller added as subview 【发布时间】:2017-07-01 09:46:39 【问题描述】:

我最近升级到 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)

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

如果我只是使用

呈现pickerController,则回调 (didSelectAssets) 有效
self.present(pickerController, animated: true) 

【问题讨论】:

Present 方法如你所知以模态方式呈现 VC。我的印象是您的按钮周围有一些额外的视图。 我希望 isUserInteractionEnabled 是真的。 【参考方案1】:

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

如果您想以这种方式显示它,则需要对 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 中的一些其他功能 - 我刚刚做了一个快速测试以获得回调工作。

【讨论】:

完美运行。我没想到 :) 非常感谢您如此深入地研究它!【参考方案2】:

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

【讨论】:

【参考方案3】:

您可以使用 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)

【讨论】:

以上是关于Swift 3:按钮在控制器上不起作用添加为子视图的主要内容,如果未能解决你的问题,请参考以下文章

UIButton 在 UIWindow 的子视图上不起作用

UIButton 在 UIPopoverController 中不起作用

尝试添加为子视图时,ScrollView 不起作用

添加 AVPlayerLayer 作为当前视图的子层在 iPhone 5 上不起作用

按钮stackView间距不起作用-Swift-以编程方式

用于在 Swift 中删除 UITableView 中的行的编辑按钮不起作用