2016-03-27 15 views
-1

はSimulatorで動作しますが、実際のデバイスでテストするには実際のデバイスでは動作しません。混乱、私はデバイスを介してデバッグについて話しているのではなく、それがデバイス上で動作するかどうかをテストしている)。複雑さはシミュレータでは動作しますが、デバイスでは動作しません

具体的には、ウォッチ・デバイス上:

  • 私は私に(シミュレータ上で getPlaceholderTemplateForComplication動作するため、これまでのところは良い、あまりにも)プレースホルダーテキストを与える時計の文字盤を、カスタマイズスルーウォッチの合併症を選択します。 ...
  • が、その後合併症は常に( シミュレータ上でgetCurrentTimelineEntryForComnplication動作するため、適切でない )プレースホルダーテキストとしてとどまる...
  • タイムトラベルスループレースホルダーテキストないのちゃんをスクロールしてもGEちょうど暗くなり(正しくないため、シミュレータ上でgetTimelineEntriesForComplication:afterDate作品)... iPhone上

Info:WatchKit拡張で

game.duel = playoffs[“Duel”] as! String 
    game.tv = playoffs[“TV”] as! String 
    game.td = playoffs[“TD”] as! AnyObject 
    let dictionary = [“Duel” : game.duel, “TV” : game.tv, “TD” : game.td] 
    let transferComplication = WCSession.defaultSession().transferCurrentComplicationUserInfo(dictionary) 

ExtensionDelegate

var duelArray = [String]() 
    var tvArray = [String]() 
    var tdArray = [NSDate]() 
    let defaults = NSUserDefaults.standardUserDefaults() 

     if let duel = userInfo[“Duel”] as? String, let tv = userInfo[“TV”] as? String, let td = userInfo[“TD”] as? String { 
      duelArray.append(duel) 
      tvArray.append(tv) 
      tdArray.append(td as! NSDate) 
      defaults.setObject(duelArray, forKey: “DuelSaved”) 
      defaults.setObject(tvArray, forKey: "TVSaved”) 
      defaults.setObject(tdArray, forKey: "TDSaved”) 
} 

ComplicationController WatchKit拡張で:

transferCurrentComplicationUserInfo渡すデータデータがNSUserDefaultsに保存されているウォッチExtensionDelegateへ:

func getCurrentTimelineEntryForComplication(complication: CLKComplication, withHandler handler: ((CLKComplicationTimelineEntry?) -> Void)) { 
switch complication.family { 
     case .ModularLarge: 
      let mlTemplate = CLKComplicationTemplateModularLargeStandardBody() 
       if let currentDuel = defaults.arrayForKey(“DuelSaved”) as? [String] { 
         let firstDuel = currentDuel[0] 
         let headerTextProvider = CLKSimpleTextProvider(text: firstDuel) 
         mlTemplate.headerTextProvider = headerTextProvider 
       } else { 
        // … 

       } 
       if let currentTV = defaults.arrayForKey(“TVSaved”) as? [String] { 
        let firstTV = currentTV[0] 
        let body1TextProvider = CLKSimpleTextProvider(text: firstTV) 
        mlTemplate.body1TextProvider = body1TextProvider 
       } else { 
        // … 
       } 
       if let currentTD = defaults.arrayForKey("TDSaved"){ 
         let firstTD = currentTD[0] 
         let body2TextProvider = CLKTimeTextProvider(date: firstTD as! NSDate) 
         mlTemplate.body2TextProvider = body2TextProvider 
       } else { 
        // … 
       } 
       let timelineEntry = CLKComplicationTimelineEntry(date: NSDate(), complicationTemplate: mlTemplate) 
       handler(timelineEntry) 
    // … 
} 


    func getTimelineEntriesForComplication(complication: CLKComplication, afterDate date: NSDate, limit: Int, withHandler handler: (([CLKComplicationTimelineEntry]?) -> Void)) { 
     let headerArray = defaults.arrayForKey(“DuelSaved”) 
     let body1Array = defaults.arrayForKey("TVSaved") 
     let body2Array = defaults.arrayForKey("TDSaved") 

     guard let headers = headerArray, texts = body1Array, dates = body2Array else { return } 
     var entries = [CLKComplicationTimelineEntry]() 
for (index, header) in headers.enumerate() { 
      let text = texts[index] 
      let date1 = dates[index] 
      let headerTextProvider = CLKSimpleTextProvider(text: header as! String, shortText: headerShort as? String) 
      let body1TextProvider = CLKSimpleTextProvider(text: text as! String) 
      let timeTextProvider = CLKTimeTextProvider(date: date1 as! NSDate) 
      let template = CLKComplicationTemplateModularLargeStandardBody() 

      template.headerTextProvider = headerTextProvider 
      template.body1TextProvider = body1TextProvider 
      template.body2TextProvider = timeTextProvider 

      switch complication.family { 
      case .ModularLarge: 
       let timelineEntry = CLKComplicationTimelineEntry(date: date1 as! NSDate, complicationTemplate: template) 
       entries.append(timelineEntry) 
      // … 
} 

    func requestedUpdateDidBegin() {   
     let server=CLKComplicationServer.sharedInstance() 
     for comp in (server.activeComplications) { 
      server.reloadTimelineForComplication(comp) 
     } 
    } 

これは、データの流れです。 ComplicationControllerは、その最初のデータをNSUserDefaultsから取得します。一見

+0

情報が不十分です。あなたの合併症は、最初に開始されたときに最初のデータをどこで取得しますか?エントリがない場合は、空の(またはnil)配列を処理している可能性があります。更新が行われた後、 'createData()'は何をしていますか?同期ですか?そうでない場合、合併症はデータなしで更新され、更新が行われた後にデータが到着する。 –

+0

@PetahChristianいいですね、あまりにも多くの情報を投稿したくないので、もう少し追加する必要があることを教えてくれてありがとう。合併症初期データが既に*は前*情報が受信された初期データを要求しています 'transferCurrentComplicationUserInfo' – victorpulak

+0

ClockKitから渡された' 'ExtensionDelegate's didReceiveUserInfo'内に作成されたNSUserDefaults''から来ているので、そこではありません表示する初期エントリ。初期データを取得したら、(タイムラインをリロードして)合併症を手動で更新する必要があります。 –

答えて

1

:あなたが、見つかったUnicodeのカーリー引用」についてXcodeの修正 - それはエラーの多くを見ることになるだろうと

  • これは、コードを作業するためには表示されません... "

  • as!で強制的にダウンキャストしないようにしてください。コードがクラッシュする可能性があります。不必要な型キャストがたくさんあります。 As I mentioned beforeの場合は、コンパイラがプログラマのエラーをキャッチできるように変数を入力する必要があります。例えば

    、あなたの辞書のキーと値の両方が文字列である場合は、安全として、それを入力します。as?ダウンキャストが不可能な場合は、渡されたので

    var playoffs: [String: String] 
    
  • あなたの拡張デリゲートコードが条件付き(、失敗する可能性がありますあなたが受け取ることを期待していたものとは異なるもの)。予想される値の型を渡していること、またはブロック全体が実行されないことを確認してください。デバッガでブレークポイントを設定し、そのコードをステップ実行することで、簡単に確認できます。

    情報が受信されると、あなたはまた、明示的にあなたの合併症を更新する必要があります。

    func session(session: WCSession, didReceiveUserInfo userInfo: [String : AnyObject]) { 
        if let ... { // Retrieve values from dictionary 
    
         // Update complication 
         let complicationServer = CLKComplicationServer.sharedInstance() 
         guard let activeComplications = complicationServer.activeComplications else { // watchOS 2.2 
          return 
         } 
    
         for complication in activeComplications { 
          complicationServer.reloadTimelineForComplication(complication) 
         } 
        } 
    } 
    
  • それは本当にあなたが配列やNSUserDefaultsでやっていること畳み込まれています。起動の間でデータを永続化するために完全に適切ですが、NSUserDefaultsはあなたのコードの一部から別の詳細は、「合格」するための方法であることを意図されることはありません。

    あなたの合併症データソースの代わりにNSUserDefaultsから、モデルまたはデータマネージャからデータを取得する必要があります。

  • getCurrentTimelineEntryForComplicationif let ... { } else {コードは意味がありません。文字列の配列を取得していない場合は、elseブロックで何をすると思われますか?

    またそうのように、コードをより読みやすく、コンパクトにするために、switch文の前に、あなたのデータを準備することができます

    func getCurrentTimelineEntryForComplication(complication: CLKComplication, withHandler handler: ((CLKComplicationTimelineEntry?) -> Void)) { 
        // Call the handler with the current timeline entry 
    
        let recentData = DataManager.sharedManager.complicationData ?? "???" 
    
        let template: CLKComplicationTemplate? 
        let simpleTextProvider = CLKSimpleTextProvider(text: recentData) 
    
        switch complication.family { 
        case .ModularLarge: 
         let modularLargeTemplate = CLKComplicationTemplateModularLargeStandardBody() 
         modularLargeTemplate.headerTextProvider = CLKSimpleTextProvider(text: "Update Complication", shortText: "Update") 
         modularLargeTemplate.body1TextProvider = simpleTextProvider 
         template = modularLargeTemplate 
        case .UtilitarianLarge: 
         let utilitarianLargeTemplate = CLKComplicationTemplateUtilitarianLargeFlat() 
         utilitarianLargeTemplate.textProvider = simpleTextProvider 
         template = utilitarianLargeTemplate 
        case .CircularSmall: 
         let circularSmallTemplate = CLKComplicationTemplateCircularSmallSimpleText() 
         circularSmallTemplate.textProvider = simpleTextProvider 
         template = circularSmallTemplate 
        case .ModularSmall: 
         let modularSmallTemplate = CLKComplicationTemplateModularSmallSimpleText() 
         modularSmallTemplate.textProvider = simpleTextProvider 
         template = modularSmallTemplate 
        case .UtilitarianSmall: 
         let utilitarianSmallTemplate = CLKComplicationTemplateUtilitarianSmallFlat() 
         utilitarianSmallTemplate.textProvider = simpleTextProvider 
         template = utilitarianSmallTemplate 
        } 
        let timelineEntry = CLKComplicationTimelineEntry(date: NSDate(), complicationTemplate: template!) 
        handler(timelineEntry) 
    } 
    

可能性の高い問題はClockKitが良く、合併症データを求めたということですの前にあなたのエクステンションもそれを受け取ったので、あなたの複雑なデータソースは提供するデータがなく、エントリは表示されません。何かがシミュレータ上で動作するように起こっていても

は、それはあなたのコードは、実際のデバイス上で動作するように堅牢であることを意味しません。実際のハードウェアではうまくいかない理由を説明できる相違点があります。そのため、デバイスでインタラクティブにデバッグする必要があります。コードが意図したとおりに動作しない理由を理解するのに役立ちます。

理想的には、ここに来る前に、このタイプのインタラクティブなデバッグを行い、他の問題を解決する必要があります。質問を最小限のコードブロックでにお寄せください。誰かがあなたのコードを広範囲にデバッグすることを要求する質問は、一般に他の人には有用ではありません。

関連する問題