【问题标题】:Swift 3: Buttons not working on controller added as subviewSwift 3:按钮在控制器上不起作用添加为子视图
【发布时间】: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 是真的。

标签: ios swift controller addsubview


【解决方案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)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多