【问题标题】:Match row selected to pass data匹配选定的行以传递数据
【发布时间】:2019-04-02 22:37:51
【问题描述】:

我查看了所有这些 Swift、asp.net 和 javascript 问题。

1 2 3 4 5

目标:
当我从MessageListController 中的聊天消息列表中选择一条消息时,我希望下一个ChatDetailController 中打开的会话成为选定的会话。

我在这个 iOS 图像中为我的 WatchKit 应用程序做同样的事情。选择与 Sophia 的消息并打开与 Sophia 的聊天。 [![在此处输入图片描述][6]][6]

我想传递 json “message_id”,即 chatMessageId 属性。正如您在代码中看到的那样,我已经将chatMessageIdMessageModel 传递到ChatDetailController

ChatModel我需要通过的chatMessageId吗?还是我已经传递了我需要的数据?

传递的上下文:可选(HTWatch_Extension.MessageModel(合作伙伴:“9859”,昵称:“Marco”,消息:“你见过是狗吗?”,城市:“马德里”,countryBadgeImageURL:https://i.imgur.com/PJcyle7.jpg,messageListImageURL:@ 987654327@,chatMessageId:“Tva9d2OJyWHRC1AqEfKjclRwXnlRDQ”,状态:“离线”))

尝试: 我是否需要将解析ChatModelChatModelawakeWithContext 方法中取出并放入MessageListControllerdidSelectRowAt 方法中的do-catch 块?


消息列表控制器

// ...code...

var messageObject = [MessageModel]()
var chatObject = [ChatModel]()

// ...code...

override func table(_ table: WKInterfaceTable, didSelectRowAt rowIndex: Int) {

    var messageContext = messageObject[rowIndex]
    var chatContext = chatObject[rowIndex]

    do {
        guard let fileUrl = Bundle.main.url(forResource: "Chats", withExtension: "json") else {
            print("File could not be located")
            return
        }
        let data = try Data(contentsOf: fileUrl)
        let decoder = JSONDecoder()

        let msg = try decoder.decode([ChatModel].self, from: data)
        self.chatObject = msg

    } catch let error {
        print(error)
    }

    messageContext.chatMessageId = (chatObject as AnyObject).filter { (dictionaryTemp:[String:String]) -> Bool in
        return dictionaryTemp["message_id"] == chatContext.chatMessageId
    } 

    // WatchKit's model presentation method.
    presentController(withName: "ChatDetailController", context: messageContext)
}

【问题讨论】:

    标签: json swift chat messaging


    【解决方案1】:

    如果我理解正确,您的Chat.json 将拥有所有消息 ID 的聊天记录。选择其中一个消息 ID 行并加载相应的聊天记录。

    在这种情况下,您可以使用filter 根据消息进行解析。假设您在这样的字典中有它。

    例子:

    let responseString = "{\"name\":\"Tom\"}"
    
    if let responseData = responseString.data(using: .utf8){
        do {
    
        let object = try JSONSerialization.jsonObject(with:responseData , options: .allowFragments)
        print("Response Object=\(object)")
        } catch{
            print("parsing Error=\(error)")
        }
    }
    

    您可以使用类似的代码来创建您的对象。最终对象应该类似于chatDictionary

    let chatDictionary = [
    [
        "fromId": "zz1234skjksmsjdfwe2zz",
        "toId": "qq43922sdkfjsfmmxdfqq",
        "messageText": "Have you seen is dog?",
        "imageUrl": "https://i.imgur.com/PJcyle7.jpg",
        "message_id": "Tva9d2OJyWHRC1AqEfKjclRwXnlRDQ",
        "read": "true"
        ],
    [
        "fromId": "zz1234skjksmsjdfwe2zz",
        "toId": "qq43922sdkfjsfmmxdfqq",
        "messageText": "Yes I have. It's cute.",
        "imageUrl": "https://i.imgur.com/PJcyle7.jpg",
        "message_id": "Tva9d2OJyWHRC1AqEfKjclRwXnlRDQ",
        "read": "true"
        ],
    [
        "fromId": "zz1234skjksmsjdfwe2zz",
        "toId": "qq43922sdkfjsfmmxdfqq",
        "messageText": "I want to get a pet too.",
        "imageUrl": "https://i.imgur.com/PJcyle7.jpg",
        "message_id": "Tva9d2OJyWHRC1AqEfKjclRwXnlRDQ1",
        "read": "true"
        ]
    ]
    

    您在索引处选择行

        override func table(_ table: WKInterfaceTable, didSelectRowAt rowIndex: Int) {
    
                let message = messageObjects[rowIndex]
                // Create a chat object Dictionary, parse it before you pass it to the detail View Controller , if you have the chat.json.
    // I have used 'Tva9d2OJyWHRC1AqEfKjclRwXnlRDQ', but here you can your message id property to make it dynamic
                message.chatObjects= chatDictionary.filter { (dictionaryTemp:[String : String]) -> Bool in
                return dictionaryTemp["message_id"] == "Tva9d2OJyWHRC1AqEfKjclRwXnlRDQ"
            }
                presentController(withName: "ChatDetailController", context: message)
            }
    

    【讨论】:

    • 我正在考虑chat.json和message.json,就像你提到的那样。我正在使用 JSONSerialization,从字符串中获取对象。
    • 您的数据结构是正确的,我看不出有任何问题,但我假设您有两个网络调用,一个用于获取 Message.json,另一个用于 Chat.json。在我的示例中,我使用 Dictionary 进行了解释,但您可以在 Chat Array Object 上应用相同的过滤器。
    • 今天我查看了我的帐户,发现我没有将您的答案标记为正确。抱歉投票迟了。
    猜你喜欢
    • 2022-07-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2020-10-10
    • 1970-01-01
    • 2018-07-20
    • 2023-03-16
    • 2012-09-27
    相关资源
    最近更新 更多