チュヌトリアルwatchOS 4甚のシンプルなアプリケヌションの䜜成

画像

このチュヌトリアルでは、watchOS 4甚のシンプルだが完党に機胜するアプリケヌションを䜜成したす。具䜓的には、Apple Watch甚のAir Aber航空䌚瀟のアプリケヌションに取り組みたす。

このチュヌトリアルでは次のこずを説明したす。


パヌト1はじめに


この郚分から次のこずを孊びたす。


降りる


このチュヌトリアルの初期プロゞェクトをダりンロヌドするこずから始めたしょう。

Xcodeで開き、ビルドしお実行したす。 空癜の癜い画面が衚瀺されるはずです。



ご芧のずおり、これたでのずころ、このプロゞェクトには非垞に倚くのものがありたす。いく぀かの必芁な補助ファむルがあり、それだけです。 この問題はすぐに解決したす

WatchKitアプリを远加する


ファむル\新芏\タヌゲット...を遞択したす。 開いたダむアログで、 watchOS \ Application \ WatchKit Appを遞択し、[ 次ぞ ]をクリックしたす。


次の画面で、 補品名ずしお「 りォッチ」ずいう単語を入力し、「 蚀語」フィヌルドで「 Swift」が遞択されおいるこずを確認し、遞択したすべおのチェックボックスをオフにしたす。 [ 完了 ]をクリックしたす。


システムは、「りォッチ」スキヌムをアクティブにする必芁があるかどうかを尋ねたす。それが必芁になるので、 アクティブ化を遞択したす。


おめでずうございたす、最初のWatchアプリを䜜成したした すべおが本圓にシンプルです。

このアクションにより、プロゞェクトナビゲヌタで、1぀ではなく2぀のタヌゲットアセンブリず、2぀の察応するグルヌプが実際に䜜成されたこずがわかりたす。 これは、iOSでToday拡匵機胜が動䜜するのず同じように、Watchアプリケヌションコヌドが実際にWatchアプリケヌション内に含たれる拡匵機胜拡匵機胜ずしお実行されるために発生したした。

ProjectナビゲヌタヌでWatchおよびWatch Extensionグルヌプを展開するず、ストヌリヌボヌドがWatchグルヌプにあり、タヌゲットアセンブリテンプレヌトによっお䜜成されたクラスがWatch Extensionグルヌプにあるこずがわかりたす。


これは、䜜業で埓う順序です。远加されたコヌドはWatch Extensionグルヌプ内に保存され、タヌゲットのWatch Extensionアセンブリに远加され、リ゜ヌスたたはストヌリヌボヌドはWatchグルヌプに远加されたす。

少し掃陀


続行する前に、眮換するタヌゲットアセンブリテンプレヌトによっお远加されたいく぀かの芁玠を削陀する必芁がありたす。

ProjectナビゲヌタでInterfaceController.swiftを右クリックし、[ 削陀]を遞択したす。 ダむアログボックスで、[ ゎミ箱に移動 ]を遞択しお、ファむルがプロゞェクトから実際に削陀されるようにしたす。


次に、 Interface.storyboardを開き、そこで䜿甚可胜な唯䞀のむンタヌフェむスコントロヌラヌを遞択しお、 削陀ボタンをクリックしたす。 結果ずしお、空のストヌリヌボヌド、たたは私が奜むように空のキャンバスが必芁です。

䞀般的なデヌタずコヌド


初期プロゞェクトには、Air Aberフラむトに関するすべおの情報ず、このデヌタを衚すモデルクラスを含むJSONファむルがありたす。 これは、iOSアプリケヌションずWatchアプリケヌションが同じクラスのモデルずデヌタを䜿甚する可胜性が高いため、タヌゲットアセンブリ間で共通する必芁があるものです。DRYの原則を芚えおいたすか

プロゞェクトナビゲヌタで共有グルヌプを展開し、 Flights.jsonを遞択したす。 次に、 ファむルむンスペクタヌで[ タヌゲットメンバヌシップ]セクションを芋぀け、[ りォッチ拡匵機胜]チェックボックスをオンにしたす。


これで、ファむルはAirAberずWatch Extensionの 䞡方に含たれたす。

共有グルヌプ内の別のファむル-Flight.swiftに察しおプロセスを繰り返したす。

これで、ようやくフラむト情報むンタヌフェむスの䜜成を開始できたす

むンタヌフェむス䜜成


Watch \ Interface.storyboardを開き、 むンタヌフェむスコントロヌラヌをオブゞェクトラむブラリからストヌリヌボヌドキャンバスにドラッグしたす 。 むンタヌフェむスコントロヌラヌを遞択した状態で、[属性]むンスペクタヌを開き、[ 識別子]を[ フラむト]に蚭定しお、[ 初期コントロヌラヌ]チェックボックスをオンにしたす。 ロヌド時のアクティビティむンゞケヌタのチェックを倖したす。



そのため、コヌドでむンタヌフェむスコントロヌラヌにアクセスできるように識別子を蚭定したす。 [ むニシャルコントロヌラヌ]チェックボックスをオンにするこずで、Watchアプリケヌションを初めお起動するずきにこのむンタヌフェむスコントロヌラヌを衚瀺する必芁があるこずをWatchKitに知らせるだけです。 このむンタヌフェむスはデヌタをダりンロヌドしないため、アクティビティむンゞケヌタを衚瀺する必芁はありたせん。

このチュヌトリアルを簡玠化するために、42 mm時蚈のみのむンタヌフェむス図を䜜成したす。 独自のアプリケヌションでは、すべおの時蚈サむズで正しく衚瀺されるかどうかを確認する必芁がありたす。 衚瀺方法ストヌリヌボヌドの巊䞋隅でApple Watch 42mmを遞択する必芁がありたす。



Watchアプリのレむアりトは、iOSのレむアりトずはたったく異なりたす。 最初に気付くのは、UIオブゞェクトをむンタヌフェむスコントロヌラヌにドラッグしお移動たたは倉曎できるこずです。 オブゞェクトをコントロヌラヌにドラッグするず、そのオブゞェクトは前のオブゞェクトの䞋に配眮され、画面がすぐにいっぱいになりたす。 オブゞェクトを䞀列に䞊べるには、iOSおよびmacOSのスタックビュヌに非垞に䌌たグルヌプを䜿甚する必芁がありたす。

そのため、最初に、オブゞェクトラむブラリからグルヌプ グルヌプをむンタヌフェむスコントロヌラヌにドラッグしたす。


今のずころあたり印象的ではありたせんが、このグルヌプには将来的に゚アアバヌのロゎ、フラむト番号、飛行ルヌトが含たれる予定です。

新しいグルヌプを遞択した埌、属性むンスペクタヌに移動し、 むンセットをカスタムに倉曎したす。 グルヌプのむンデントを手動で蚭定できる4぀のテキストフィヌルドが衚瀺されたす。

Topの倀を6に倉曎したす。


この方法では、䞊郚にもう少しむンデントを远加するだけです。

次に、 画像グルヌプにドラッグアンドドロップしたす。 グルヌプがむンデントに折り畳むこずで反応する堎合 thanks、Xcode 、画像をドキュメントアりトラむンに盎接ドラッグし、次のグルヌプではなくグルヌプの子になるこずを確認したす。


次に、衚瀺された画像が必芁です。 このロゎをダりンロヌドしお、 Watch \ Assets.xcassetsにドラッグしたす。 画像が2倍のスロットを占める新しい画像セットが䜜成されたす。


この画像にコヌポレヌトカラヌのAir Aberのタッチを加えたいので、画像を遞択し、[ テンプレヌト画像に レンダリング]の倀を倉曎したす。


Watch \ Interface.storyboardを再床開いお、 imageを遞択したす 。 属性むンスペクタヌを䜿甚しお、次の倉曎を行いたす。


属性むンスペクタヌは次のようになりたす。



ロゎが衚瀺されおいなくおも心配する必芁はありたせん。Xcodeは開発䞭に画像テンプレヌトの色盞を倉曎しないようです。 信じおください。アプリケヌションをビルドしお実行するず、明るいピンク色になりたす。

次に、䜜成したグルヌプに別のグルヌプをドラッグし、画像の右偎に衚瀺されるこずを確認しおから、属性むンスペクタヌを䜿甚しおそのレむアりトをVerticalに倉曎したす。 たた、 間隔をカスタム\ 0に倉曎し、 幅をコンテンツに合わせおサむズに倉曎したす。

次に、2぀のラベルを新しいグルヌプにドラッグアンドドロップしたす。 垂盎方向の䜍眮を蚭定しお、ラベルが䞊䞋に衚瀺されるようにしたす。


トップラベルを遞択し、属性むンスペクタヌを䜿甚しおテキストフィヌルドにFlight 123を入力し、 テキストカラヌをFA114Fに倉曎したす RGBパネルを再入力する代わりに、カラヌメニュヌの最近䜿甚したカラヌリストからピンクを遞択できたす。

次に、䞋のラベルを遞択し、[ テキスト]フィヌルドにMEL to SFOず入力したす。 むンタヌフェむスコントロヌラヌは次のようになりたす。



このテキストは䞀時的なものであり、むンタヌフェむスをコントロヌラヌクラスに接続するず眮き換えられたす。

次に、別のグルヌプをむンタヌフェむスコントロヌラヌにドラッグしたすが、今回は必ず最初のグルヌプの隣接芁玠ずしお远加しおください。 グルヌプを階局内で正しく配眮できない堎合は、ドキュメントアりトラむンを䜿甚したす。


この新しいグルヌプを遞択した状態で、 レむアりトを垂盎に 、 間隔をカスタム\ 0に蚭定したす。

次に、3぀のラベルをこの新しいグルヌプにドラッグアンドドロップしたす。


ドキュメントのアりトラむンで、3぀すべおのラベルがグルヌプの暪にあるのではなく、グルヌプ内にあるこずを確認しおください

トップラベルを遞択し、属性むンスペクタヌをText to AA123 Boardsに倉曎したす。

次に、䞭倮のラベルを遞択し、 Textを15:06に眮き換えたす。 次に、 Text ColorをFA114Fに、 FontをSystemに倉曎し、 StyleをRegularに蚭定しお、 Sizeを54に遞択したす。 最埌に、 44の倀でHeightをFixedに倉曎したす。

䞋のラベルを遞択し、そのテキストをOn timeに 、 テキストの色を04DE71に眮き換えたす。

むンタヌフェむスコントロヌラヌは次のようになりたす。


次に、別のグルヌプを远加するだけで、このむンタヌフェヌスが実際のデヌタを衚瀺できるように、Outletクラスのフィヌルドの䜜成に進みたす。

新しいグルヌプをオブゞェクトラむブラリから䞋のグルヌプにドラッグしたす。今回は子であり、それを含むグルヌプの䞀番䞋にあるはずです。 次に、2぀のラベルを远加したす 。 これで、むンタヌフェむスオブゞェクトの完党な階局は次のようになりたす。


巊ラベルのテキストの属性むンスペクタヌをGate 1Aに蚭定したす。 右ラベルのText倀をSeat 64Aに蚭定し、 Horizo​​ntal Alignmentの Rightオプションを遞択したす。

これで、完成したむンタヌフェヌスは次のようになりたす。


おめでずうございたす。これで、最初のWatchアプリのむンタヌフェヌスレむアりトの䜜成が完了したした。 次に、実際のデヌタを入力しお、シミュレヌタヌでアプリケヌションを実行する必芁がありたす。

コントロヌラヌの䜜成


ProjectナビゲヌタでWatch Extensionグルヌプを右クリックし、 New File ...を遞択したす。 開いたダむアログで、 watchOS \ Source \ WatchKit Classを遞択し、 Nextをクリックしたす。 新しいクラスにFlightInterfaceControllerずいう名前を付け、それがWKInterfaceControllerサブクラスでWKInterfaceController 、 蚀語がSwiftに蚭定されおいるこずを確認したす 。


[ 次ぞ] 、[ 䜜成]の順にクリックしたす 。

コヌド゚ディタヌで新しいファむルが開いたら、3぀の空のメ゜ッドブランクを削陀したす。むンポヌトステヌトメントずクラス定矩のみが必芁です。

FlightInterfaceController䞊に次のアりトレットフィヌルドを远加したす。

 @IBOutlet var flightLabel: WKInterfaceLabel! @IBOutlet var routeLabel: WKInterfaceLabel! @IBOutlet var boardingLabel: WKInterfaceLabel! @IBOutlet var boardTimeLabel: WKInterfaceLabel! @IBOutlet var statusLabel: WKInterfaceLabel! @IBOutlet var gateLabel: WKInterfaceLabel! @IBOutlet var seatLabel: WKInterfaceLabel! 

ここでは、以前にむンタヌフェむスに配眮した各ラベルにアりトレットを远加したした。 間もなく接続したす。

次に、アりトレットフィヌルドの䞋に次のプロパティずプロパティオブザヌバを远加したす。

 // 1 var flight: Flight? { // 2 didSet { // 3 guard let flight = flight else { return } // 4 flightLabel.setText("Flight \(flight.shortNumber)") routeLabel.setText(flight.route) boardingLabel.setText("\(flight.number) Boards") boardTimeLabel.setText(flight.boardsAt) // 5 if flight.onSchedule { statusLabel.setText("On Time") } else { statusLabel.setText("Delayed") statusLabel.setTextColor(.red) } gateLabel.setText("Gate \(flight.gate)") seatLabel.setText("Seat \(flight.seat)") } } 

ここで、各ステップで䜕が起こるかを瀺したす。

  1. Flight型の補助プロパティを宣蚀したした。 このクラスはFlight.swiftで宣蚀されおいたす 。これは、タヌゲットのWatch Extension構成に以前に远加された共通コヌドの䞀郚です。
  2. プロパティが蚭定されたずきに実行されるプロパティオブザヌバを远加したした。
  3. 補助プロパティに実際にフラむトが含たれ、 nilではないこずを確認したす。 正しいFlightむンスタンスがあるこずがわかっおいる堎合にのみ、タグの構成を続行できたす。
  4. 適切なflightプロパティを䜿甚しおタグを蚭定したす。
  5. フラむトが遅れる堎合、ラベルのテキストの色を赀に倉曎したす。

ここで、コントロヌラヌの最初のディスプレむでflightを蚭定する必芁がありたす。 flight宣蚀の䞋に次の行を远加したす。

 override func awake(withContext context: Any?) { super.awake(withContext: context) flight = Flight.allFlights().first } 

次のパヌトでは、枡されたコンテキストを䜿甚するようにこの実装を倉曎したすが、今のずころは䞀般的なJSONファむルからすべおのフラむトをロヌドし、配列から最初のフラむトを取埗したす。

泚  awake(withContext:)は、コントロヌラヌがストヌリヌボヌドから読み蟌たれ、そのすべおのアりトレットフィヌルドが構成された埌に呌び出されるため、これはflightを蚭定するのに最適な堎所です。

アプリケヌションをビルドしお実行する前に残っおいる最埌のステップは1぀だけです。このステップは、アりトレットフィヌルドを接続するこずです。

コンセントフィヌルドを接続する


Watch \ Interface.storyboardを開き、むンタヌフェむスコントロヌラヌを遞択したす。 Identityむンスペクタヌを䜿甚しお、 Custom Class \ ClassをFlightInterfaceControllerに蚭定したす 。

次に、以䞋のリストに埓っおコンセントフィヌルドを接続したす。




アプリケヌションを開始する前に、必芁なこずは1぀だけです。 このチュヌトリアルで開発したアプリケヌションの䟋は42 mmのApple Watch甚に䜜成されたため、正しいシミュレヌタが蚭定されおいるこずを確認する必芁がありたす。そうしないず、むンタヌフェむスが少し歪んで芋える堎合がありたす。 これらのアプリケヌションでは、開発者はすべおの時蚈サむズでむンタヌフェヌスの動䜜をテストしたすが、これはこのチュヌトリアルのトピックには適甚されたせん。

[Watch Scheme]メニュヌを開き、42 mmりォッチシミュレヌタヌのいずれかを遞択したす。


アプリケヌションをビルドしお実行したす。 シミュレヌタヌのダりンロヌドが完了するず、正しいむンタヌフェヌスレむアりトずピンクのAir Aberロゎが衚瀺されたす。 Flightオブゞェクトは、着陞時間ず座垭番号のランダムな倀を生成するため、他の倀が衚瀺されたす。


泚 むンストヌルの倱敗に関するメッセヌゞが衚瀺された堎合は、Xcodeでプロセスを繰り返すか、クロックシミュレヌタヌでアプリケヌションを手動でむンストヌルしおください。 これを行うには、iOSシミュレヌタヌでWatchアプリケヌションを開き、 AirAberをタップしおから 、 Apple Watchでアプリを衚瀺するをオンに切り替えたす。 その埌、クロックシミュレヌタヌに戻り、 Digital Crownをタップしおメむン画面に移動し、AirAberアむコンをタップしおアプリケヌションを起動したす。

おめでずうございたす 最初のWatchKitむンタヌフェヌスの実装が完了し、実際のデヌタを備えたクロックシミュレヌタヌで動䜜したす-すばらしい仕事です

チュヌトリアルのこの郚分で行ったこずの既補の䟋を次に瀺したす。

パヌト2テヌブル


チュヌトリアルの最初の郚分では、最初のむンタヌフェむスコントロヌラヌを䜜成しお、watchOS 4の開発の基本に぀いお孊びたした。

シリヌズの第2郚では、アプリケヌションがフラむトのリストを衚瀺できるようにテヌブルを远加したす。

その過皋で、次のこずを孊びたす。


仕事を始める


Watch \ Interface.storyboardを開き、別のむンタヌフェむスコントロヌラヌをオブゞェクトラむブラリからストヌリヌボヌドの既存のフラむトコントロヌラヌの巊偎にドラッグしたす 。

新しいむンタヌフェむスコントロヌラヌを遞択した埌、属性むンスペクタヌを開き、次の倉曎を行いたす。


フラむトコントロヌラヌず同様に、このむンタヌフェむスコントロヌラヌにコヌドでアクセスできるように識別子を蚭定したす。 これは、Watchアプリケヌションの実際の初期コントロヌラヌであるため、タむトルを蚭定しおチェックボックスをオンにする必芁がありたす。 このコントロヌラヌは、䜕らかのデヌタ゜ヌスからテヌブルをロヌドするため、アクティビティむンゞケヌタヌを衚瀺したす。

それでは、むンタヌフェむスに移りたしょう。 テヌブルをオブゞェクトラむブラリから新しいむンタヌフェむスコントロヌラにドラッグしたす 。


ドキュメントアりトラむンでテヌブル行コントロヌラヌを遞択したす 。


属性むンスペクタヌを䜿甚しお、 識別子を FlightRowに蚭定し たす 。 識別子は、䜜成する行むンスタンスをテヌブルに指瀺するずきに行タむプでもあるため、名前を付けるこずが重芁です。

文字列むンタヌフェむスの䜜成


テヌブル行は実際にはグルヌプなので、任意の耇雑な構成を指定できたす。

最初のタスクは、デフォルトの構成グルヌプに2぀の倉曎を加えるこずです。 ドキュメントのアりトラむンで、テヌブルの行内のグルヌプを遞択し、属性むンスペクタヌを䜿甚しお、 間隔を 6に 、 高さをコンテンツに合わせおサむズに蚭定したす。

デフォルトでは、テヌブル行には暙準の高さが固定されおいたす。 ただし、ほずんどの堎合、远加されたすべおのむンタヌフェむスオブゞェクトを衚瀺するためにラむンが必芁なので、このようにHeight属性を倉曎する䟡倀が垞にありたす。

次に、オブゞェクトラむブラリからテヌブル行グルヌプにセパレヌタをドラッグしたす。 実際には䜕も分離したせんが、単にテヌブルの行に小さな芖芚的なタッチを䞎えたす。 セパレヌタを遞択した埌、属性むンスペクタヌを䜿甚しお次の倉曎を行いたす。


むンスペクタヌは次のようになりたす。



テヌブルの列が突然倧きくなり、画面党䜓に衚瀺されたした しかし、文字列構成を構成するプロセスでこれを修正したす。

グルヌプをオブゞェクトラむブラリから区切り文字の右偎のテヌブル行にドラッグしたす。 遞択したグルヌプで、属性むンスペクタヌで次の属性を倉曎したす。


おそらく、Spacing属性を頻繁に操䜜するこずに気づいたでしょう。 グルヌプのむンタヌフェヌスのオブゞェクト間のスペヌスを単玔に狭め、小さな画面ですべおを少し明確にしたす。

別のグルヌプを新しく远加したグルヌプにドラッグし、次の倉曎を加えたす。


これで、テヌブルの行が通垞の高さに戻りたした

次に、この新しいグルヌプにラベルず画像を远加したす。 ラベルを蚭定しおからコピヌしお曎新し、各フラむトの開始点ず終了点を衚瀺したす。

次に、画像に䜕かを入れる必芁がありたす。 この画像をダりンロヌドしお、 Watch \ Assets.xcassetsに远加したす。 これにより、珟圚の画像が2xスロットを占める新しい平面画像のセットが䜜成されたす。


この画像にAir Aberのピンク色を䞎えたいので、画像を遞択し、属性むンスペクタヌを䜿甚しおRender As倀をTemplate Imageに蚭定したす。

Watch \ Interface.storyboardを再床開き、ドキュメントアりトラむンで画像を遞択したす。 属性むンスペクタヌを䜿甚しお、次の倉曎を行いたす。


ラベルを遞択し、そのテキストフィヌルドをMELに蚭定したす。 次に、 フォントをシステムに倉曎し、 セミボヌルドスタむルずサむズ20にしたす。 最埌に、 垂盎方向の配眮をCenterに蚭定したす 。

ラベルをコピヌしお、画像の右偎に貌り付けたす。 テキストをSFOに倉曎し、 氎平配眮を右に倉曎したす。 テヌブル行は次のようになりたす。


泚ラベルのコピヌを挿入するず、ドキュメントアりトラむン内の䜍眮に関係なく、ラベルが画像の巊偎に貌り付けられるこずがありたす。ただし、氎平方向の配眮を右に蚭定するず、所定の䜍眮に移動したす。

むンタヌフェむスオブゞェクトの階局は次のようになりたす。


テヌブル行むンタヌフェむスはほが完成したした。フラむト番号ずステヌタスのみを远加したす。

別のグルヌプをオブゞェクトラむブラリからテヌブルの行にドラッグしお、出発ラベルず到着ラベルを含むグルヌプの隣に配眮したす。


このむンタヌフェむスの䜜成を続けるず、耇雑な構成を䜜成するために、構成が混圚する組み蟌みグルヌプを䜿甚する方法の他の䟋が衚瀺されたす。この自動レむアりトが必芁なのは誰ですか

この新しい氎平グルヌプに2぀のラベルをドラッグしたす。属性むンスペクタヌを䜿甚しお、巊偎のラベルを倉曎したす。


次に、適切なラベルを倉曎したす。


これらの最埌の倉曎を行った埌、テヌブルの完成した行は次のようになりたす。


Interface Builderでテヌブルを蚭定したら、いく぀かのデヌタを入力するこずができたす。

テヌブル充填


最初に行うこずはWKInterfaceController、テヌブルを管理するクラスのサブクラスを䜜成するこずです。

グルヌプを右クリックしりォッチ拡匵プロゞェクトナビゲヌタでを遞択し新芏...ファむルを。衚瀺されるダむアログで、watchOS \ Source \ WatchKit Classを遞択し、Nextをクリックしたす。新しいクラスにScheduleInterfaceControllerずいう名前を付けたす。WKInterfaceControllerのサブクラスであり、蚀語がSwiftに蚭定されおいるこずを確認したす。


[ 次ぞ]、[ 䜜成]の順にクリックしたす。

コヌド゚ディタヌで新しいファむルが開いたら、むンポヌトステヌトメントずクラス定矩のみが残るように、3぀の空のメ゜ッドブランクを削陀したす。Watch \ Interface.storyboardを

再床開き、新しいむンタヌフェむスコントロヌラヌを遞択したす。Identityむンスペクタヌで、Custom Class \ ClassをScheduleInterfaceControllerに眮き換えたす。


むンタヌフェむスコントロヌラヌを遞択したたた、アシスタント゚ディタヌを開き、そこに衚瀺されおいるこずを確認したすScheduleInterfaceController。次に、Controlキヌを抌しながら、テヌブルからドキュメントのアりトラむンにクラス定矩ScheduleInterfaceControllerにドラッグしお、Outletフィヌルドを䜜成したす。


コヌルアりトレットショッピングflightsTableは、それがタむプに蚭定されおいるこずを確認しWKInterfaceTableをクリックし、接続を。

独自のクラスを蚭定し、テヌブルにOutletを䜜成したので、それを蚭定したす。

アシスタント゚ディタヌを閉じ、ScheduleInterfaceController.swiftを開き、アりトレットの盎埌に次の行を远加したす。

 var flights = Flight.allFlights() 

ここでは、すべおのフラむト情報を含むプロパティをむンスタンスの配列ずしお远加するだけFlightです。

次に、次の実装を远加したすawake(withContext:)。

 override func awake(withContext context: Any?) { super.awake(withContext: context) flightsTable.setNumberOfRows(flights.count, withRowType: "FlightRow") } 

ここで、の各フラむトに察しおInterface Builderで䜜成した行をむンスタンス化する必芁があるこずをテヌブルに通知したすflights。行数は配列のサむズに等しく、行タむプはストヌリヌボヌドで蚭定した識別子です。

アプリケヌションをビルドしお実行したす。いく぀かの行で満たされたテヌブルが衚瀺されたす。各行の隣には、゚アアバヌの飛行機のピンクの画像がありたす。


しかし、ちょっず埅っおくださいタむトルは、ホットピンクのコヌポレヌトカラヌであるAir Aberではなく、ダヌクグレヌです。今それを修正したす。Watch \ Interface.storyboardを

開き、Air Aberむンタヌフェむスコントロヌラヌを遞択したす。ファむルむンスペクタで、グロヌバルティントをFA114Fに倉曎したす。


アプリケヌションをビルドしお実行したす。それは良いです


しかし、今ではすべおの行に、Interface Builderで蚭定したプレヌスホルダヌテキストが衚瀺されおいるこずがわかりたす。次に、行ごずにラベルを蚭定する行コントロヌラヌを远加しお、これを修正したす。

行コントロヌラヌの远加


WatchKitテヌブルはiOSテヌブルよりもはるかに単玔です。ここにはデヌタ゜ヌスやデリゲヌトはありたせん。行コントロヌラヌクラスを䜜成するだけです。これは、名前にもかかわらず、クラスのサブクラスですNSObject。

グルヌプを右クリックしりォッチ拡匵プロゞェクトナビゲヌタでを遞択し新芏...ファむルを。開いたダむアログボックスで、watchOS \ Source \ WatchKit Classを遞択し、Nextをクリックしたす。新しいクラスにFlightRowControllerずいう名前を付けたす。それはのサブクラスであるこずを確認しNSObjectの、 -およびない WKInterfaceController -そしお、その蚀語はSwiftが重芁です


[ 次ぞ]、[ 䜜成]の順にクリックしたす。

コヌド゚ディタで新しいファむルが開いたら、クラスの先頭に次の行を远加したす。

 @IBOutlet var separator: WKInterfaceSeparator! @IBOutlet var originLabel: WKInterfaceLabel! @IBOutlet var destinationLabel: WKInterfaceLabel! @IBOutlet var flightNumberLabel: WKInterfaceLabel! @IBOutlet var statusLabel: WKInterfaceLabel! @IBOutlet var planeImage: WKInterfaceImage! 

ここでは、テヌブル行に远加された各ラベルにアりトレットを远加するだけです。間もなく接続したす。

次に、アりトレットフィヌルドのすぐ䞋に、次のプロパティずプロパティオブザヌバヌを远加したす。

 // 1 var flight: Flight? { // 2 didSet { // 3 guard let flight = flight else { return } // 4 originLabel.setText(flight.origin) destinationLabel.setText(flight.destination) flightNumberLabel.setText(flight.number) // 5 if flight.onSchedule { statusLabel.setText("On Time") } else { statusLabel.setText("Delayed") statusLabel.setTextColor(.red) } } } 

各段階で䜕が起こるかを次に瀺したす。

  1. 型の補助プロパティを宣蚀したすFlight。このクラスはFlight.swiftで宣蚀されおいたす。これは、チュヌトリアルの前の郚分でWatch Extensionに远加された䞀般的なコヌドの䞀郚です。
  2. プロパティが蚭定されたずきに実行されるプロパティオブザヌバを远加したす。
  3. , flight nil : , Flight .
  4. flight .
  5. , .

行コントロヌラヌの構成が完了したら、それを䜿甚するためにテヌブルの行を曎新する必芁がありたす。Watch \ Interface.storyboardを

開き、ドキュメントアりトラむンでFlightRowを遞択したす。 Identityむンスペクタヌを䜿甚しお、Custom Class \ ClassをFlightRowControllerに蚭定したす。ドキュメントアりトラむン、すべおのグルヌプを開くFlightRow、その埌を右クリックFlightRowアクションのポップアップりィンドりやアりトレットのフィヌルドを匕き起こすために、




このポップアップを右にドラッグしお、FlightRowのすべおのオブゞェクトを衚瀺できたす。

たず、planeImageテヌブルの行の画像ずseparatorセパレヌタヌに接続したす。次に、以䞋のリストに埓っお、残りのアりトレットフィヌルドを接続したす。


最埌の手順は、テヌブル内の各行コントロヌラヌにScheduleInterfaceControllerむンスタンスを枡すように曎新するこずFlightです。ScheduleInterfaceController.swiftを

開き、次の行を远加したす。awakeWithContext(_:)

 for index in 0..<flightsTable.numberOfRows { guard let controller = flightsTable.rowController(at: index) as? FlightRowController else { continue } controller.flight = flights[index] } 

ここforで、テヌブル内の各行をルヌプし、察応するむンデックスを䜿甚しお行コントロヌラヌのテヌブルを照䌚したす。コントロヌラヌを正しくリク゚ストするず、むンスタンスが取埗されたすFlightRowController。次に、controller.flight察応する芁玠flightを配列に蚭定しflightsたす。これにより、オブザヌバヌが実行didSetさFlightRowControllerれ、テヌブル行のすべおのラベルが蚭定されたす。

䜜業の結果を確認するずきです。アプリケヌションをビルドしお実行したす。テヌブル行に正しいフラむト情報が入力されおいるこずがわかりたす。


そしお今、チュヌトリアルのこの郚分の最埌のタスクナヌザヌがテヌブルの行をタッチするずScheduleInterfaceController、察応するフラむトをコンテキストずしお、チュヌトリアルの前の郚分で䜜成したフラむト情報むンタヌフェむスに転送し、衚瀺する必芁がありたす。

遞択した文字列に䞀臎


最初に行うこずはWKInterfaceTable、テヌブル行を遞択する凊理を実行するメ゜ッドをオヌバヌラむドするこずです。次の行に

远加しScheduleInterfaceControllerたす。

 override func table(_ table: WKInterfaceTable, didSelectRowAt rowIndex: Int) { let flight = flights[rowIndex] presentController(withName: "Flight", context: flight) } 

ここではflights、このメ゜ッドに枡された行むンデックスを䜿甚しお、察応するフラむトから取埗したす。次に、context送信の品質で、フラむトの詳现むンタヌフェむスを衚瀺したすflight。枡される名前presentController(withName:context:)は、チュヌトリアルの前の郚分でストヌリヌボヌドに蚭定した識別子です。

さお、最初の郚分で玄束したように、FlightInterfaceControllerそれcontextを䜿甚しおむンタヌフェヌスを構成するように倉曎したす。FlightInterfaceController.swiftを

開き、を芋぀けたす。この行を芋぀けたすawake(withContext:)

 flight = Flight.allFlights().first 

次の行に眮き換えたす。

 if let flight = context as? Flight { self.flight = flight } 

ここではcontext、むンスタンスずしお倉換しようずしおいたすFlight。これが成功した堎合、それをjob self.flightに䜿甚したす。これにより、プロパティオブザヌバヌが実行され、むンタヌフェむスが構成されたす。

このパヌトでは、最埌にアプリケヌションをビルドしお実行したす。衚の行をタッチするず、遞択されたフラむトに関する情報ずずもに、フラむト情報むンタヌフェヌスがモヌダルでどのように衚瀺されるかがわかりたす。


おめでずうございたす 最初のテヌブルの実装が完了し、実際のデヌタが入力されたした。 玠晎らしい仕事です

ここでプロゞェクトの準備ができお䟋我々は、このチュヌトリアルでは、これたで行われおいるこず。

パヌト3アニメヌション


チュヌトリアルの第3郚では、アプリケヌションの䟋ずしお、新しいフラむト登録むンタヌフェむスを䜿甚しおwatchOS 4アニメヌションを䜿甚する方法を孊習したす。

その過皋で、次のこずを孊びたす。


仕事を始める


Watch \ Interface.storyboardを開き、むンタヌフェむスコントロヌラヌをオブゞェクトラむブラリからストヌリヌボヌドキャンバスにドラッグしたす。コントロヌラむンタヌフェむスを遞択した埌、属性むンスペクタを開き、に入力する識別子倀チェックむン。これを実行しお、からむンタヌフェむスコントロヌラヌを定矩できるようにしたしたScheduleInterfaceController。

次に、オブゞェクトラむブラリグルヌプから新しいむンタヌフェむスコントロヌラヌにドラッグしたす。属性むンスペクタヌで、次の倉曎を行いたす。


むンタヌフェむスコントロヌラヌは次のようになりたす。


次に、テヌブル行甚に䜜成したlabel-image-labelから同じグルヌプを䜜成したす。

別のグルヌプを䜜成したグルヌプにドラッグし、属性むンスペクタヌに次の倉曎を加えたす。


この新しいグルヌプにラベルず画像を远加したす。ラベルを蚭定しおからコピヌしお曎新し、各フラむトの開始点ず終了点を衚瀺したす。

ストヌリヌボヌドたたはドキュメントのアりトラむンで画像を遞択したす。属性むンスペクタヌで、次の倉曎を行いたす。


前ず同様に、画像は色盞を倉曎しないため、むンタヌフェむスコントロヌラヌの黒い背景には衚瀺されたせん。しかし、私たちはそれがそこにあるこずを知っおいたす。

ラベルを遞択し、テキスト倀をMELに蚭定したす。次に、フォントをシステムに倉曎し、セミボヌルドスタむルずサむズ20にしたす。最埌に、垂盎方向の配眮をCenterに蚭定し、幅ず高さがコンテンツに合わせおサむズに蚭定されおいるこずを確認したす。

ラベルをコピヌしお、画像の暪に貌り付けたす。テキストをSFOに、氎平方向の配眮を右。むンタヌフェむスコントロヌラヌは次のようになりたす。


さあ、巚倧な登録ボタンを远加したしょう

登録ボタンを远加


ボタンをオブゞェクトラむブラリからむンタヌフェむスコントロヌラヌにドラッグし、フラむトの開始点ず終了点のラベルを含むグルヌプに隣接する芁玠であるこずを確認したす。


WatchKitのボタンは非垞に柔軟です。デフォルトの倖芳今远加したような倖芳で䜿甚したり、レむアりトグルヌプに倉えお他のむンタヌフェむスオブゞェクトを远加しお倖芳をカスタマむズしたりできたす。それが私たちのするこずです。

ボタンを遞択し、属性むンスペクタヌに次の倉曎を加えたす。


むンタヌフェむスコントロヌラヌは次のようになりたす。


ボタンのコンテンツ属性を倉曎するず、ドキュメントアりトラむンに新しいグルヌプが衚瀺されるこずに気づいたでしょう。


独自の登録ボタンの背景ずしお䜿甚したす。このグルヌプを遞択し、属性むンスペクタヌに次の倉曎を加えたす。


むンタヌフェむスコントロヌラヌは次のようになりたす。


登録ボタンはすでにその圢を取り始めおいたす。䞍足しおいるのはラベルだけなので、ここで远加したす。オブゞェクトラむブラリからボタンに属するグルヌプにラベルを

ドラッグし、遞択したす。次の倉曎を再床属性むンスペクタヌにしたす。


登録むンタヌフェヌスの完成したコントロヌラヌは次のようになりたす。


むンタヌフェヌスが完成したら、WKInterfaceControllerこのコントロヌラヌを制埡するサブクラスの䜜成に進みScheduleInterfaceController、衚瀺するように倉曎したす。

コントロヌラヌの䜜成


グルヌプを右クリックしりォッチ拡匵プロゞェクトナビゲヌタでを遞択し新芏...ファむルを。衚瀺されるダむアログで、watchOS \ Source \ WatchKit Classを遞択し、Nextをクリックしたす。新しいクラスにCheckInInterfaceControllerずいう名前を付け、それがWKInterfaceControllerのサブクラスであり、SwiftがLanguageに遞択されおいるこずを確認したす。


[ 次ぞ]、[ 䜜成]の順にクリックしたす。

コヌド゚ディタヌで新しいファむルが開いたら、むンポヌトステヌトメントずクラス定矩のみが含たれるように、3぀の空のメ゜ッドブランクを削陀したす。

次に、クラスの䞊郚に次の行を远加したす。

 @IBOutlet var backgroundGroup: WKInterfaceGroup! @IBOutlet var originLabel: WKInterfaceLabel! @IBOutlet var destinationLabel: WKInterfaceLabel! 

ここでは、最も倖偎のグルヌプのアりトレットフィヌルドず、䜜成した2぀のむンタヌフェむスラベルを远加したす。すぐにそれらすべおを接続したす。

次に、[アりトレット]フィヌルドの䞋に次を远加したす。

 var flight: Flight? { didSet { guard let flight = flight else { return } originLabel.setText(flight.origin) destinationLabel.setText(flight.destination) } } 

ここFlightでは、プロパティオブザヌバヌを含む補助型プロパティを远加したした。オブザヌバヌは、実行時にからラッパヌを削陀しようずしflight、成功した堎合は、flight2぀のラベルを䜿甚しお構成したす。これはすべお私たちにすでによく知られおいたす。

ここflightで、コントロヌラヌがあるかどうかを蚭定するだけです。CheckInInterfaceController次の行に远加したす。

 override func awake(withContext context: Any?) { super.awake(withContext: context) if let flight = context as? Flight { self.flight = flight } } 

あなたはすでにこれに粟通しおいたす。ラッパヌを削陀しcontextお、むンスタンスに倉換しようずしおいたすFlight。これが成功した堎合、タスクに䜿甚しself.flight、プロパティオブザヌバを実行しお、むンタヌフェむスを蚭定したす。

最埌に、awake(withContext:)次のアクションのすぐ䞋に远加したす。

 @IBAction func checkInButtonTapped() { // 1 let duration = 0.35 let delay = DispatchTime.now() + (duration + 0.15) // 2 backgroundGroup.setBackgroundImageNamed("Progress") // 3 backgroundGroup.startAnimatingWithImages(in: NSRange(location: 0, length: 10), duration: duration, repeatCount: 1) // 4 DispatchQueue.main.asyncAfter(deadline: delay) { [weak self] in // 5 self?.flight?.checkedIn = true self?.dismiss() } } 

ここで、各ステップで䜕が起こるかを瀺したす。

  1. 2぀の定数を䜜成したす。1぀はアニメヌションの継続時間甚、もう1぀は遅延甚で、その埌コントロヌラヌがオフになりたす。delay-これはDoubleむンスタンスDispatchTimeではなく、Grand Central Dispatchで䜿甚するためです。
  2. Progress backgroundGroup . WKImageAnimatable , .
  3. . , repeatCount , 1, , .
  4. WatchKit , Grand Central Dispatch .
  5. , flight , .

ここで、プロゞェクトに画像を远加し、アりトレットず1぀のアクションを接続するだけです。このzipファむルを

ダりンロヌドしお解凍し、フォルダヌをWatch \ Assets.xcassetsにドラッグしたす。

内容ではなくフォルダをドラッグアンドドロップしたす。これにより、Progressずいう名前のリ゜ヌスディレクトリにグルヌプが䜜成され、いく぀かの画像セットが含たれたす。


画像を远加するこずで、アりトレットフィヌルドずボタンアクションを割り圓おるこずができたす。Watch \ Interface.storyboardを

開き、新しいむンタヌフェむスコントロヌラヌを遞択したす。Identityむンスペクタヌで、Custom Class \ ClassをCheckInInterfaceControllerに眮き換えたす。


次に、ドキュメントアりトラむンでCheckInを右クリックしお、アりトレットフィヌルドずアクションを衚瀺したす。backgroundGroupむンタヌフェむスコントロヌラヌの最も倖偎のグルヌプに接続したす。


ストヌリヌボヌドキャンバスでdestinationLabel、SFOをoriginLabel含むラベルに接続し、MELを含むラベルに接続したす。

次にcheckInButtonTapped、倧きな䞞いピンクのボタンに接続したす。


アプリケヌションをビルドしお実行する前に、最埌の倉曎、぀たりむンタヌフェむスコントロヌラヌの衚瀺を行う必芁がありたす。

コントロヌラヌのマッピング


ScheduleInterfaceController.swiftを開き、table(_:didSelectRowAt:)その内容を芋぀けお次の行に眮き換えたす。

 let flight = flights[rowIndex] let controllers = ["Flight", "CheckIn"] presentController(withNames: controllers, contexts: [flight, flight]) 

ここflightsで、むンデックスrowIndexを䜿甚しお察応するフラむトを取埗し、衚瀺する2぀のむンタヌフェむスコントロヌラヌの識別子を含む配列を䜜成し、それらを衚瀺しお、䞡方をflightquality で枡したすcontext。

アプリケヌションをビルドしお実行したす。フラむトをタッチするず、衚瀺されおいるむンタヌフェむスコントロヌラヌがいく぀か衚瀺されたす。巊にスワむプしお登録コントロヌラヌを開き、ボタンをタップしおアニメヌションを開始しお登録したす。


これはそれ自䜓で玠晎らしいように芋えたすが、チェックむンされおいるフラむトがスケゞュヌルむンタヌフェむスコントロヌラヌで匷調衚瀺されおいる方が良いです。これは、次の最埌のセクションで行いたす。

フラむトハむラむト


FlightRowController.swiftを開き、次のメ゜ッドを远加したす。

 func updateForCheckIn() { let color = UIColor(red: 90/255, green: 200/255, blue: 250/255, alpha: 1) planeImage.setTintColor(color) separator.setColor(color) } 

ここでは、むンスタンスを䜜成しUIColor、それぞれ、色調や色を蚭定するためにそれを䜿甚し、その埌、planeImageずseparator。このメ゜ッドは、アニメヌションが閉じるずきに呌び出されるため、色の倉化が矎しくアニメヌション化されたす。

次に、ScheduleInterfaceController.swiftを開き、flights次のプロパティを远加したす。

 var selectedIndex = 0 

2぀のむンタヌフェむスコントロヌラヌを衚瀺するずきに、テヌブルのどの行が遞択されおいるかを蚘憶するために䜿甚したす。これで、衚の行を遞択するずきに蚭定するだけで十分です。盎接呌び出しの䞊に次の行を远加presentController(withNames:contexts:)したすtable(_:didSelectRowAt:)

 selectedIndex = rowIndex 

この行はselectedIndex、テヌブル内の遞択された行のむンデックス倀を蚭定したす。

最埌に、次の行をのScheduleInterfaceControllerすぐ䞋に远加したすawake(withContext:)。

 override func didAppear() { super.didAppear() // 1 guard flights[selectedIndex].checkedIn, let controller = flightsTable.rowController(at: selectedIndex) as? FlightRowController else { return } // 2 animate(withDuration: 0.35) { // 3 controller.updateForCheckIn() } } 

各段階で䜕が起こるかを次に瀺したす。

  1. 遞択したフラむトのチェックむンが完了しおいるかどうかを確認しおください。もしそうなら、テヌブル内の察応するむンデックスを持぀行コントロヌラをむンスタンスに倉換しようずしおいたすFlightRowController。
  2. これが成功した堎合、アニメヌションAPIを䜿甚しWKInterfaceControllerお、0.35秒でクロヌゞャを実行したす。
  3. 閉じるずきに、に远加したメ゜ッドを呌び出したすFlightRowController。これにより、画像の色ずテヌブルのこの行のセパレヌタが倉曎され、登録が完了したこずを知らせる芖芚的なフィヌドバックがナヌザヌに提䟛されたす。

アプリケヌションをビルドしお実行したす。前ず同じ手順に埓っおフラむトに登録するず、スケゞュヌルむンタヌフェむスのコントロヌラヌに戻り、テヌブルの察応する行の画像ずセパレヌタヌの色が次第に新しい色に倉わりたす。


おめでずうございたすWatchKitアニメヌションの最初のセットの実装が完了したした。

ここでプロゞェクトの準備䟋このチュヌトリアルで行っおいたす。

このパヌトでは、2皮類のWatchKitアニメヌションを䜜成する方法を孊びたした。最初はアニメヌション化された䞀連の画像をWKInterfaceController䜿甚し、2番目はアニメヌションAPIを䜿甚したした。

Source: https://habr.com/ru/post/J343432/


All Articles