2015-07-19 7 views
10

Oto pełna błędu:imagePickerController: didFinishPickingMediaWithInfo konfliktów z opcjonalnej metody wymogiem w protokole „UIImagePickerControllerDelegate”

Objective-C method 'imagePickerController:didFinishPickingMediaWithInfo:' provided by method 'imagePickerController(_ :didFinishPickingMediaWithInfo:)' conflicts with optional requirement method 'imagePickerController(_:didFinishPickingMediaWithInfo:)' in protocol 'UIImagePickerControllerDelegate'

Występuje na pierwszy z tej funkcji w moim pliku ViewController.swift:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]){ 
    if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage { 
     ImageView.contentMode = .ScaleAspectFit 
     ImageView.image = pickedImage 
    } 

    dismissViewControllerAnimated(true, completion: nil) 
} 

Próbuję wykonać ten samouczek: http://www.codingexplorer.com/choosing-images-with-uiimagepickercontroller-in-swift/

z metody błędu, rozumiem, że istnieje metoda didFinishPick ingMediaWithInfo, które pobiera z klasy bazowej imagePickerController i nie podoba mi się to, że próbuję go zastąpić. Ale to wszystko, co wiem. Wszystkie funkcje imagePickerController, które znajduję w Internecie, wyglądają tak. Co ja robię źle?

Używam Xcode 7, jeśli to robi różnicę. ]

Screenshot 1

Odpowiedz

21

Poprawna głowa funkcja:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 
    <#code#> 
} 

Zanotuj String zamiast NSObject w deklaracji słownika informacyjnym.

Nie jestem pewien, dlaczego dokumenty mówią, że trzeba napisać NSObject, ale String jest poprawny.

Jeśli zaimplementujesz jakieś metody protokołów, polecam użycie automatycznego uzupełniania Xcode, aby upewnić się, że nie napotkasz na takie problemy.

enter image description here

jestem pewien gdzie Xcode robi to zakończenie auto z ale wydaje się być zawsze w synchronizacji z rzeczywistą kompilatora, który w końcu jest jedna rzecz, którą trzeba się martwić o raczej niż niektóre internetowych docs jabłoni ! Zwłaszcza w czasach, gdy ramy wciąż się zmieniają, a nawet sam język jest w fazie rozwoju.

+0

Twoja odpowiedź stałe mój problem, choć XCode 8 autouzupełnianie spowodowała, więc autouzupełniania może się mylić, jak również. Zobacz moją odpowiedź poniżej – n13

+0

Swift 3: "func imagePickerController (_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String: Any]) {' –

4

Jeśli używasz Xcode 7, mogą być skierowane iOS 9, a następnie, w którym podpis metoda nieznacznie zmieniony z:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) { 

do:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 

NSObject zmieniła do String.

W Swift 3 ona zmieniona na

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) 
0

Poniżej format didFinishPickingMediaWithInfo delegat UIImagePickerController:

public func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) 

W swojej przypadek użycia String zamiast NSObject w parametr funkcji.

Screenshot 1

0

miałem ten problem pisząc rozszerzenie UIImagePickerControllerDelegate w Xcode 8

XCode 8 autouzupełnianie wytwarza podpis metody znakiem podkreślenia dla pierwszego parametru. Powoduje to błąd segmentacji w kompilatorze Swift. Usunięcie podkreślnika rozwiązuje problem.

// CRASH SegFault 11 
@objc protocol MyDelegate: UIImagePickerControllerDelegate { 

} 
extension MyDelegate { 
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
     // code 
    } 
} 


// DOESN'T CRASH 
@objc protocol MyDelegate: UIImagePickerControllerDelegate { 

} 

extension MyDelegate { 
    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
     // code 
    } 
} 
Powiązane problemy