2016-09-03 6 views
2

참고 :이 대부분을 알아 냈습니다. 끝에있는 업데이트를 확인하십시오. 아직도 약간 혼란.은 Swift 3/iOS 10에서 continueUserActivity를 트리거 할 수 없습니다.

Swift 3에서 Xc8b6에서 NSUserActivity 처리를 구현하고 처리기 프로토콜 메서드의 메서드 서명에 문제가 있습니다. 현재 문서에서

는 방법이라고합니다 : 이것은 신속한 헤더 인터페이스에 표시되는 내용과 약간 다른

func application(_ application: UIApplication, 
       continue userActivity: NSUserActivity, 
     restorationHandler: @escaping ([Any]?) -> Void) -> Bool 

. 저기, 수복물의 반환 유형은 신속합니다. 무효. 나는이 때

, 내가 오류는 다음과 같습니다

목표 - C 방법 '응용 프로그램 : 계속 : restorationHandler는'방법으로 를 제공하는 '응용 프로그램 (_ : 계속 : restorationHandler :'하지 않습니다 경기 요구 사항의 선택 ('응용 프로그램 : continueUserActivity : restorationHandler :')

나는 컴파일러 경고가 지금 좋은하지 않습니다 실현,하지만 난이의의 Obj-C 방법 서명을 찾았다 뜻이 걸릴 ,하지만 그건 어떻게 든 내 주장 꽤 일치하지 마라.

어디로 갈 지 잘 모르겠습니다. 거기에있는 것과 일치하지만 뭔가이 잘못되었습니다. 무작위 추측과 확인은 아직 나를 도왔다.

흥미롭게도, 자동 완성은 나에게 다른 방법 서명을주는이 일에 대한

public func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: ([Any]?) -> Void) -> Bool 

좋은 것은 그것이 컴파일 것입니다. 덜 좋은 점은 Spotlight에서 인덱싱 된 항목을 선택하고 탭하여 앱을 시작하면 트리거되지 않는다는 것입니다.

확실히 NSUserAction이 앱을 올바르게 식별하여 시작했습니다. 내가 복구 할 수없는 곳에서 내가 누락 될 수있는 뭔가가 있나? 핸들러? 이것은 iOS 9에서 잘 돌아가는 프로젝트에서 변환 된 것입니다.

또한 What 's New With Search의 WWDC 비디오에서 프로토콜 메소드 서명의 다른 버전을 보았습니다. 나는 그것을 시험해 보았지만 컴파일했지만 트리거하지는 않았다.

스위프트 3 변환 도구를 완료 한 후 서명 한 것입니다. 그것은 컴파일하지만, 스포트라이트에서 시작할 때 트리거되지 않은 : -----

확인

func application(application: UIApplication, continueUserActivity userActivity: NSUserActivity, restorationHandler: ([AnyObject]) -> Void) -> Bool 

---- 업데이트. 따라서 위에서 언급 한 첫 번째 메소드 서명이 올바른 것입니다. 문제는 AppDelegate의 확장에서 정의하고 있다는 것입니다. 이것은 Swift 2.x에서 정상적으로 작동했습니다.

나는 그것을 위로 옮겼다. 그리고 모든 것은 멋지다. 하지만 확장에서 프로토콜 메서드를 구현할 때 이러한 컴파일 오류가 발생하는 이유에 대해 더 잘 이해하고 싶습니다. 프로토콜 준수를 통해 더 이상 수행하지 않습니까? 확장 프로그램에 추가하려고하면 복제본임을 나타내는 오류가 발생하므로 그럴 것이라고 생각하지 않습니다.

+0

프로토콜 확장에 함수를 추가하면 원래 프로토콜 정의 안에 함수를 추가하는 것과 같습니다. 그래서 복제본이라는 오류가 발생합니다. 프로토콜 확장이 특정 유형에만 해당되는 경우 다른 이야기입니다. – user1046037

+0

프로토콜 확장이 아닙니다. 이전 질문에 답을 얻었으므로 이제 새로운 질문을 만들어야 할 것입니다. 잠깐 - 확장 기능은 다음과 같습니다. 확장 AppDelegate { 그래서 프로토콜은 확장하지만 클래스는 확장하지 않습니다. – jeffro37

답변

2

원래의 질문은 continueUserActivity가 호출되지 않고 (올바른 서명이 무엇인지) 왜 여기에 잘못되었는지에 대한 명확성을 추가하는 대답에 대한 답변이었습니다.

올바른 서명은 내 게시물의 상단에 넣어 것입니다 :

func application(_ application: UIApplication, 
       continue userActivity: NSUserActivity, 
     restorationHandler: @escaping ([Any]?) -> Void) -> Bool 

명심이 서명이 자동 완성 Xc8b6에서 제공하는 것과 다른, 그래서 다른 사람에서이 혜택을 명중 의심되는 이 응답.

내 원래 문제는 확장 프로그램 내에서 수행했기 때문에 컴파일되지 않았기 때문입니다. 명확하게하기 위해 :

extension AppDelegate { 
    func application(_ application: UIApplication, 
        continue userActivity: NSUserActivity, 
        restorationHandler: @escaping ([Any]?) -> Void) -> Bool { 
    return true 
    } 
} 

이는 나이가 아이폰 OS에 (이전 continueUserActivity 서명 포함) 9/스위프트 2.X 프로젝트를했다. 왜 여전히 긍정적이지는 않지만 Xc8/Swift 3의 확장 프로그램에서는 컴파일되지 않습니다.

클래스 범위로 옮겼습니다.

+0

AppDelegate의 선택적 방법으로 같은 문제가 발생합니다. 그들은 더 이상 확장 기능을 구축하지 않습니다 .. 이것은 매우 성가 시며 AppDelegate를 더러워지게 만듭니다. func에는 fileprivate와 같은 범위가있을 수 있다고 생각합니까? 그래서 확장 프로그램은 그들을 볼 수 없습니다 –

+0

@ jeffro37 서명이 저에게 오류를주고 있습니다. 스위프트 사용하기 4. – Jonny

0

그래서 Swift 3부터는 프로토콜이 클래스에 첨부 된 범위에서만 프로토콜 메서드에 액세스 할 수있는 것처럼 보입니다. 당신이 방법을 액세스하려고하면

이 UIApplicationDelegate 프로토콜 안에있는 AppDelegate에 모든 방법은 클래스 AppDelegate에 또는 에 UIApplicationDelegate

을 준수 AppDelegate에의 확장에만 액세스 할 수 있음을 의미 해당 클래스/확장명 외부의 UIApplicationDelegate를 컴파일 할 수없는 UIApplicationDelegate를 준수해야합니다.