我最近升级到了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) {}
答案 0 :(得分:1)
DKImagePickerController
似乎仅为呈现作为视图控制器而设计,而不是作为childVC和子视图添加到当前视图。所以,因为你没有呈现它,它无法进行回调。
如果您想要显示它,则需要对DKImagePickerController
本身进行一些修改。
快速测试将done()
中的DKImagePickerController.swift
func更改为:
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
内的其他一些函数 - 我只是做了一个快速测试让回调工作。
答案 1 :(得分:-1)
您可以使用方法ViewWillAppear()或viewDidAppear()代替viewDidLoad()
template <typename T> // T type Node in your case
class DList
{
T** head; // array of pointers of type Node
int first; // index of first Node
int last; // index of last Node
bool* available; // array of available indexes
int list_size; // size of list
int get_index(); // search for index with value true in bool available
void return_index(int i); // mark index as free in bool available
std::ptrdiff_t link_index(T*& l) const // get index of Node
void init(); // initialize data members
void create(); // allocate arrays: head and available
void clear(); // delete array elements
void destroy(); // delete head
public:
DList(); // call create() and init()
~DList(); // call clear() and destroy()
void push_back(T* l);
void push_front(T* l);
void insert(T*& ref, T* l); // insert l before ref
T* erase(T* l); // erase current (i.e. l) and return next
T* advance(T* l, int n); // return n-th link before or after currnet
std::size_t size() const;
int capacity () const { return list_size; }
};
答案 2 :(得分:-1)
您应该检查您的选择器框架。尝试添加 clipToBounds = true 以检查是否显示整个视图。