Swift 3:未在控制器上工作的按钮添加为子视图

时间:2017-07-01 09:46:40

标签: ios swift controller addsubview

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

3 个答案:

答案 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 以检查是否显示整个视图。