2016-09-20 1 views
5

imessage 앱을 구현하고 싶지만 메시지 프레임 워크에 익숙하지 않고 iMessage 앱은 새로운 것이므로 많은 리소스가 필요하지 않습니다. 그래서 저는 WWDC video을 따르고 있고, sample app을 제공하는 사과를 사용하고 있습니다.메시지 확장에서 MSMessage를 보내는 방법은 무엇입니까?

세 가지보기가 있습니다. MessageViewController은 거의 모든 기능을 처리 한 다음 CreateViewControllerDetailsViewController입니다.

나는 간단히 있습니다 .. DetailsViewControllerCreateViewController 및 디스플레이에서 MSMessage를 만들 데이터에 추가하려합니다.

그러나 데이터를 만들려고 할 때 충돌이 발생합니다.

@IBAction func createAction(_ sender: AnyObject) { 
    //present full screen for create list 
    self.delegate?.createViewControllerDidSelectAdd(self as! CreateViewControllerDelegate)   
} 

내가 통과하려고 데이터 유형은 구조체에서 사전입니다 :

struct data { 
var title: String! 
var date: Date! 

var dictionary = ["title" : String(), "Array1" : [String](), "Array2" : [String]() ] as [String : Any] 

} 

그래서 여기 일이 설정되는 방법입니다; MessagesViewController

class MessagesViewController: MSMessagesAppViewController, { 

// MARK: Responsible for create list button 

func composeMessage(for data: dataItem) { 

    let messageCaption = NSLocalizedString("Let's make", comment: "") 

    let dictionary = data.dictionary 

    func queryItems(dictionary: [String:String]) -> [URLQueryItem] { 
     return dictionary.map { 
      URLQueryItem(name: $0, value: $1) 
     } 
    } 

    var components = URLComponents() 
    components.queryItems = queryItems(dictionary: dictionary as! [String : String]) 

    let layout = MSMessageTemplateLayout() 
    layout.image = UIImage(named: "messages-layout-1.png")! 
    layout.caption = messageCaption 

    let message = MSMessage() 
    message.url = components.url! 
    message.layout = layout 
    message.accessibilityLabel = messageCaption 

    guard let conversation = activeConversation else { fatalError("Expected Convo") } 

    conversation.insert(message) { error in 
     if let error = error { 
      print(error) 
     } 
    } 

} 

} 


extension MessagesViewController: CreateViewControllerDelegate { 

func createViewControllerDidSelectAdd(_ controller: CreateViewControllerDelegate) { 
    //CreatesNewDataItem 
    composeMessage(for: dataItem()) 
} 

} 

내가 잘못 가고 어디

/** 
A delegate protocol for the `CreateViewController` class. 
*/ 
protocol CreateViewControllerDelegate : class { 
func createViewControllerDidSelectAdd(_ controller: CreateViewControllerDelegate) 

} 

class CreateViewController: UIViewController { 

static let storyboardIdentifier = "CreateViewController" 

weak var delegate: CreateViewControllerDelegate? 

@IBAction func create(_ sender: AnyObject) { 
    //present full screen for create list 

    self.delegate?.createViewControllerDidSelectAdd(self as! CreateListViewControllerDelegate) 

} 

} 

사람이 보여 주 시겠어요와 나는 MSMessage을 보낼 수있는 방법을 CreateViewController? 내가 메시지를 보낼 수 있다면 나는 그 메시지를 받아서 다시 보낼 수 있어야한다.

+0

어떤 문제가 될 수있는의 구조체'dataItem' 전달 function'func composeMessage (data : dataItem)'이 비디오 튜토리얼에서와 같이 구조체를 사용하지 않고 문자열 값을 전송했습니다. https://www.youtube.com/watch?v=pe-J7OsQHhI – RileyDev

+0

@RileyDev - 그 것 youtube video helped! – kamyFC

답변

0

직접보고 디버그 할 수없는 한 가지 문제가 있습니다. components.queryItems를 [String : String]과 같이 사전 var 캐스트로 설정했지만 data.dictionary에서 반환 된 사전은 [String : String], a [String : Any]

특히 사전 [ "Array1"]은 단일 문자열이 아닌 문자열 배열입니다. 사전 [ "Array2"]와 동일합니다. URLQueryItem은 init()에 두 개의 문자열이 주어지기를 기대하지만 문자열과 문자열 배열을 넣으려고합니다 (실제로 queryItems (사전 :) 방법. 물론

, 당신의 dataItem.dictionary 4 개 빈 값으로 사전을 반환합니다. 내가 만약 당신이 원하는 모르겠어요.

+0

나는 실제로 QueryItems 함수와 사전을 주석 처리했다. jus는 메시지 매뉴얼을 설정했다. 그래도 여전히 런타임 크래시가 발생합니다. – JUSDEV

+0

충돌이 발생했을 때 콘솔의 텍스트는 무엇입니까? 어떤 라인에서 멈 춥니 까? –

+0

질문에있는 코드가 프로젝트에 최신 상태입니까? CreateListController에 createList() 메서드가 표시되지 않습니다. –