Ios 从iPhone发送和接收消息以从多个控制器观看

Ios 从iPhone发送和接收消息以从多个控制器观看,ios,swift,watchos,watchconnectivity,Ios,Swift,Watchos,Watchconnectivity,处理从多个控制器发送和接收的通信的正确方式是什么 我试图做的是从iOS的两个不同ViewController向WatchOS中的两个不同InterfaceController发送消息(单独发送,而不是同时发送) 这里是我所拥有的,它只适用于ViewController2和InterfaceController2之间的通信,当一条消息从ViewController1发送到InterfaceController1时,它会崩溃,因为它似乎一直以InterfaceController2的会话方法为目标

处理从多个控制器发送和接收的通信的正确方式是什么

我试图做的是从iOS的两个不同ViewController向WatchOS中的两个不同InterfaceController发送消息(单独发送,而不是同时发送)

这里是我所拥有的,它只适用于ViewController2和InterfaceController2之间的通信,当一条消息从ViewController1发送到InterfaceController1时,它会崩溃,因为它似乎一直以InterfaceController2的
会话
方法为目标

视图控制器1: InterfaceController 1:接收来自ViewController 1的消息 //===========================================

ViewController 2: InterfaceController 2:接收来自ViewController 2的消息
谢谢

根据我所读的内容,我似乎需要将通信范围缩小到一个ViewController和一个InterfaceController,然后通过
NSNotification
委派
共享更改


根据我所读的内容,似乎我需要将通信范围缩小到一个ViewController和一个InterfaceController,然后通过
NSNotification
委派
共享更改


我建议从处理UI的控制器中删除所有数据管理。这是一个糟糕的设计,可能会导致你头痛以后混合层像这样


您应该有一个数据管理器,它是
WCSession
委托,负责保存信息,然后通知相关方(视图控制器等)备份数据已更新

我建议从处理UI的控制器中删除所有数据管理。这是一个糟糕的设计,可能会导致你头痛以后混合层像这样


您应该有一个数据管理器,它是
WCSession
委托,负责保存信息,然后通知相关方(视图控制器等)备份数据已更新

@ccjensen-谢谢你的建议。快速提问。我将从多个iOS ViewController向WatchOS中的多个InterfaceController发送信息,您是否建议在每个设备中创建一个数据模型,然后将这些模型用作每个设备中的中心通信?是的,这听起来是一种明智的方法。然后,任何一方的视图控制器将允许用户编辑数据,这些数据将被传送到模型层,然后可能有一个通信管理器订阅模型更改,并决定将更改传送给交易对手的内容、时间和方式。非常感谢。@ccjensen-谢谢你的好建议。快速提问。我将从多个iOS ViewController向WatchOS中的多个InterfaceController发送信息,您是否建议在每个设备中创建一个数据模型,然后将这些模型用作每个设备中的中心通信?是的,这听起来是一种明智的方法。然后,任何一方的视图控制器将允许用户编辑数据,这些数据将被传送到模型层,然后可能有一个通信管理器订阅模型更改,并决定将更改传送给交易对手的内容、时间和方式。谢谢。
class ViewController1: UIViewController,WCSessionDelegate{
    var session: WCSession!
    override func viewDidLoad() {
      super.viewDidLoad()
        if WCSession.isSupported() {
          session = WCSession.default()
          session.delegate = self
          session.activate()
        }
     }

      func sendDataToWatch(){
        let sendPrice:[String: Double] = ["price": 3.99]
        session.sendMessage(sendPrice, replyHandler: { replyMessage in
            // Some reply here, this could be nil
        }, errorHandler: {error in
            // Catch any errors here, this could be nil
            print("Error: \(error.localizedDescription)")
        })
     }
}
class InterfaceController1: WKInterfaceController, WCSessionDelegate{
   var session: WCSession!

    override func awake(withContext context: Any?) {
        super.awake(withContext: context)

        if (WCSession.isSupported()) {
            session = WCSession.default()
            session.delegate = self
            session.activate()
        }
    }

   func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) {

    /// Capture data from ViewContorller 2
    let priceFromPhone = message["price"] as? String

    // do something with priceFromPhone
   } 
}
class ViewController2: UIViewController,WCSessionDelegate{
    var session: WCSession!
    override func viewDidLoad() {
      super.viewDidLoad()
        if WCSession.isSupported() {
          session = WCSession.default()
          session.delegate = self
          session.activate()
        }
     }

   func sendDataToWatch(){
    let sendEngine:[String: Double] = ["engine": 2.5]
    session.sendMessage(sendEngine, replyHandler: { replyMessage in
        // Some reply here, this could be nil
    }, errorHandler: {error in
        // Catch any errors here, this could be nil
        print("Error: \(error.localizedDescription)")
    })
  }
}
class InterfaceController2: WKInterfaceController, WCSessionDelegate{
   var session: WCSession!

    override func awake(withContext context: Any?) {
        super.awake(withContext: context)

        if (WCSession.isSupported()) {
            session = WCSession.default()
            session.delegate = self
            session.activate()
        }
    }

   func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) {

      /// Capture data from ViewContorller 2
      let engineFromPhone = message["engine"] as? String

      // do something with engineFromPhone
    }    
 }