<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      zwvista

      導航

      使用 UIKIt + Combine + MVVM 進行 GUI 編程

      課題

      1. 程序界面由3個文本編輯框和1個文本標簽組成。
      2. 要求文本標簽實時顯示3個文本編輯框所輸入的數字之和。
      3. 文本編輯框輸入的不是合法數字時,將其值視為0。
      4. 3個文本編輯框的初值分別為1,2,3。

      創建工程

      打開 Xcode,File / New / Project..
      在 New Project 向導的第1頁,選 iOS / App
      在向導的第2頁填上 Product Name: CombineExample
      在向導的第3頁選擇任意文件夾點擊 Create 按鈕創建工程
      關閉所創建的工程

      添加 CombineCocoa 包

      選中工程,在右鍵菜單中選 Add Packages... 打開 Apple Swift Packages 對話框
      在搜索欄中輸入 https://github.com/CombineCommunity/CombineCocoa.git
      回車開始搜索
      選中搜索結果中的 CombineCocoa,點擊 Add Package 按鈕關閉對話框。
      工程下方會出現 Package Dependencies,其中包含 CombineCocoa 0.4.0

      ViewModel

      在工程中添加 NumbersViewModel.swift 文件,內容如下:

      import Foundation
      import Combine
      
      class NumbersViewModel: ObservableObject {
          @Published
          var number1 = "1"
          @Published
          var number2 = "2"
          @Published
          var number3 = "3"
          @Published
          var result = ""
      
          init() {
              $number1.combineLatest($number2, $number3)
                  .map { String((Int($0) ?? 0) + (Int($1) ?? 0) + (Int($2) ?? 0)) }
                  .assign(to: &$result)
          }
      }
      

      配置 UI

      打開 Main.storyboard 文件,在 View Controller Scene / View Controller / View 下面放置3個 Text Field 和1個 Label。

      控件變量

      打開 ViewController.swift 文件,在 ViewController 類中添加控件變量

      @IBOutlet weak var tfNumber1: UITextField!
      @IBOutlet weak var tfNumber2: UITextField!
      @IBOutlet weak var tfNumber3: UITextField!
      @IBOutlet weak var lblResult: UILabel!
      

      使用 Assistant Editor 同時打開 Main.storyboard 文件,用 Control 鍵將控件變量掛到相應的控件上。

      使用 MVVM 的解決方案

      在 ViewController 類添加 NumbersViewModel 類的實例,并且在 viewDidLoad 方法中添加綁定控件的代碼

      import UIKit
      import Combine
      import CombineCocoa
      
      class ViewController: UIViewController {
      // ...
          var vm: NumbersViewModel!
          var subscriptions = Set<AnyCancellable>()
      
          override func viewDidLoad() {
              super.viewDidLoad()
              vm = NumbersViewModel()
              vm.$number1.assign(to: \UITextField.text!, on: tfNumber1).store(in: &subscriptions)
              vm.$number2.assign(to: \UITextField.text!, on: tfNumber2).store(in: &subscriptions)
              vm.$number3.assign(to: \UITextField.text!, on: tfNumber3).store(in: &subscriptions)
              vm.$result.assign(to: \UILabel.text!, on: lblResult).store(in: &subscriptions)
              tfNumber1.textPublisher.compactMap{$0}.assign(to: &vm.$number1)
              tfNumber2.textPublisher.compactMap{$0}.assign(to: &vm.$number2)
              tfNumber3.textPublisher.compactMap{$0}.assign(to: &vm.$number3)
          }
      // ...
      }
      

      posted on 2022-08-22 13:03  zwvista  閱讀(927)  評論(0)    收藏  舉報

      主站蜘蛛池模板: 国产免费网站看v片元遮挡| av天堂午夜精品一区| 无码人妻丰满熟妇啪啪欧美| 婷婷久久香蕉五月综合加勒比 | 国产av无码国产av毛片| 人妻一区二区三区人妻黄色| 五月综合网亚洲乱妇久久| 日本中文字幕亚洲乱码| jlzz大jlzz大全免费| 精品无码人妻| 黄色亚洲一区二区在线观看| 日本另类αv欧美另类aⅴ| 久久国产免费观看精品3| 91福利视频一区二区| 亚洲国产午夜精品福利| 中文字幕无码免费久久| 永久免费的av在线电影网| 国精品无码一区二区三区在线看 | 亚洲综合无码日韩国产加勒比| 亚洲欧美日韩精品成人| 亚洲一区二区美女av| 国产一区在线播放av| av无码小缝喷白浆在线观看| 思思热在线视频精品| 亚洲永久精品日本久精品| 欧美亚洲综合成人A∨在线| 国产95在线 | 欧美| 人妻少妇偷人作爱av| 五月丁香六月综合缴情在线| 开心五月激情综合久久爱| 99久久免费只有精品国产| 国产精品不卡一二三区| 亚洲精品国产美女久久久| 毛片在线播放网址| 潮喷无码正在播放| 欧美怡春院一区二区三区| 久久三级国内外久久三级| 欧美三级中文字幕在线观看| 999精品色在线播放| 郎溪县| 开心五月深深爱天天天操|