2016-09-20 37 views
5

我想实现一个imessage应用程序,但是对于消息框架和iMessage应用程序来说,这是一个新事物,并没有太多的资源。因此,我正在关注WWDC video并使用Apples提供sample app作为指南。如何在消息扩展中发送MSMessage?

我有三个视图,MessageViewController几乎处理所有的功能,然后CreateViewControllerDetailsViewController

我只是试图从CreateViewController创建一个MSMessage并显示在DetailsViewController ..然后添加到数据。

但是,我试图创建数据时发生崩溃。

@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()) 
} 

} 

CreateViewController

/** 
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?如果我能够发送消息,我应该能够接收并重新发送。

+0

可能是什么问题正在通过结构'dataItem'在函数'func composeMessage(for data:dataItem)'我设法发送一个字符串值,而不使用像这个视频教程中的结构https://www.youtube.com/watch?v=pe-J7OsQHhI – RileyDev

+0

@RileyDev - 那个YouTube的视频帮助! – kamyFC

回答

0

我看到一个问题,但无法自己调试: 您正在将您的components.queryItems设置为字典var cast as [String:String],但从data.dictionary返回的字典不是[String :String],但是[String:Any]

特别是,dictionary [“Array1”]是一个字符串数组,而不是单个字符串。字典[“Array2”]相同。 URLQueryItem期望在它的init()中给出两个字符串,但是你试图放入一个字符串和一个字符串数组(尽管我不确定你是否真的到了queryItems的那一行(字典: )方法。

当然,你的dataItem.dictionary就返回了带有4个空值的字典,我不知道这是你想要的。

+0

我实际上已经注释掉QueryItems函数和字典,绝对设置了消息手册但仍然得到运行时崩溃 – JUSDEV

+0

什么是控制台中的文本,当它崩溃?它停在哪条线上? –

+0

您的问题中的代码是否与您的项目保持同步?我没有在CreateViewController上看到createList()方法 –