2015-10-21 3 views
0

Класс ImagePicker содержит и UIImagePicker:Swift. Pass делегата UIImagePicker в качестве аргумента

class ImagePicker { 
    let imagePicker = UIImagePickerController() 
    var delegate: AnyObject? 

    init(delegate: AnyObject?) { 
     self.delegate = delegate 
    } 

    func pickPhoto() { 
     self.imagePicker.delegate = delegate 
     // The line above gives an error "Cannot assign a value of type 'AnyObject?' to a value of type 'protocol<UIImagePickerControllerDelegate, UINavigationControllerDelegate>?' 

     delegate?.presentViewController(imagePicker, animated: true, completion: nil) 
    } 
} 

UICollectionView inits сборщика изображения:

let imagePicker = ImagePicker(self) 
imagePicker.pickPhoto() 

Так что это не работает из-за ошибки упоминалось выше, но как я это делаю?

ответ

2

Делегат не может быть типа AnyObject?. Он должен быть типа protocol<UIImagePickerControllerDelegate, UINavigationControllerDelegate>? вместо:

class ImagePicker { 
    let imagePicker = UIImagePickerController() 
    weak var delegate: protocol<UIImagePickerControllerDelegate, UINavigationControllerDelegate>? 

    init(delegate: protocol<UIImagePickerControllerDelegate, UINavigationControllerDelegate>?) { 
     self.delegate = delegate 
    } 
    .... 
} 

Вы должны также сделать его weak свойство, чтобы избежать сохранения циклов.

+0

Работы! Большое спасибо – Manuel

+0

Собственно, какой класс является делегатом, так как он определяется только его протокольными привязанностями, но класс не установлен для себя? – Manuel

+1

Весь смысл использования делегатских протоколов заключается в том, что вы не указываете класс для делегата. Таким образом, все объекты, реализующие методы, определенные в протоколе, могут действовать как делегаты. Независимо от их класса. – joern