Upgrade to Pro — share decks privately, control downloads, hide ads and more …

iOS 26 SDKの新機能 (liquid抜き) - iOS26orLaterUpdat...

iOS 26 SDKの新機能 (liquid抜き) - iOS26orLaterUpdateAndSceneForUIKit

2025年8月17日 iPhone札幌勉強会 プレゼンテーション資料

Avatar for notoroid

notoroid

August 16, 2025
Tweet

More Decks by notoroid

Other Decks in Programming

Transcript

  1. ࣗݾ঺հ w J1IPOFΞϓϦ։ൃऀ 9!OPUPSPJE  w ΞϓϦ։ൃऀྺ ʙ  w

    ΞϓϦ࡞࢛ͬͯ൒ੈل 8JOEPXTΞϓϦʙJ04  w झຯ͸ήʔϜ ൓ࣹਆܦ͕ਰ͑ͱ໨ͷർΕ͕ൈ͚ͳ͍
  2. 6*,JU͔Β4XJGU6*΁ͷҠߦαϙʔτ B 6*,JUΞϓϦʹ4XJGU6*Λ૊ΈࠐΈ C 4XJGU6*ΞϓϦʹ6*,JUػೳΛ૊ΈࠐΈ w 6*)PTUJOH$POUSPMMFS w 6*,JU಺ʹ4XJGU6*ͷ7JFXΛදࣔ w

    </FX> 6*)PTUJOH4DFOF%FMFHBUF w 6*7JFX$POUSPMMFS3FQSFTFOUBCMF w 6*7JFX3FQSFTFOUBCMF w 6*"QQMJDBUJPO%FMFHBUF"EBQUPS
  3. 6*,JU͔Β4XJGU6*΁ͷҠߦαϙʔτ B 6*,JUΞϓϦʹ4XJGU6*Λ૊ΈࠐΈ C 4XJGU6*ΞϓϦʹ6*,JUػೳΛ૊ΈࠐΈ w 6*)PTUJOH$POUSPMMFS w 6*,JU಺ʹ4XJGU6*ͷ7JFXΛදࣔ w

    </FX> 6*)PTUJOH4DFOF%FMFHBUF w 6*7JFX$POUSPMMFS3FQSFTFOUBCMF w 6*7JFX3FQSFTFOUBCMF w 6*"QQMJDBUJPO%FMFHBUF"EBQUPS 0CTFSWBUJPOGSBNFXPSL͕ڮ౉͠
  4. 0CTFSWBUJPOGSBNFXPSL 4XJGU޲͚ͷϑϨʔϜϫʔΫ w 88%$Ͱొ৔ w IUUQTTQFBLFSEFDLDPNOPUPSPJETXJGUVJNVLFOJ[IFOHMJ TBSFUB[IVBOHUBJKJBOTIJPCTFSWBUJPO w 4XJGU.BDSPTΛۦ࢖ͨ͠ػೳ w

    88%$Ͱ͸ಛʹΞοϓσʔτແ͠ w 7JTJPOGSBNFXPSLͷઆ໌Ͱ0CTFSWBUJPO͕ग़͖ͯ·͕͢͜Ε͸ผ෺ w 'PVOEBUJPOʹؚ·ΕΔΑ͏ʹͳͬͨ
  5. 6*ͷߋ৽ͱ4DFOFͷαϯϓϧ w ڞ༗TUBUJDMJCSBSZ w 6*,JUͰॻ͍ͨαϯϓϧ w J04Ҏ߱Ͱ࢖͑Δߋ৽ w J04Ҏ߱Ͱ࢖͑Δߋ৽ w

    4XJGU6*Ͱͷ࣮૷ྫ w 6*,JU্Ͱ4XJGU6*ͷ4DFOFΛ࢖༻ J04PS-BUFS6QEBUF"OE4DSFFO 4UZMF'PS6*,JU
  6. ΦϦδφϧίʔυ import UIKit // embeded Observation framework in Foundation framework

    import Shared class ViewController: UIViewController { @IBOutlet weak var number1: UITextField! @IBOutlet weak var number2: UITextField! @IBOutlet weak var number3: UITextField! @IBOutlet weak var result: UILabel! override func viewDidLoad() { super.viewDidLoad() updateResult() } private func updateResult() { result.text = "\(number1.numberValue + number2.numberValue + number3.numberValue)" } @IBAction func onChangeValue1(_ sender: Any) { updateResult() } @IBAction func onChangeValue2(_ sender: Any) { updateResult() } @IBAction func onChangeValue3(_ sender: Any) { updateResult() } }
  7. Ϟσϧʹஔ͖׵͑ "EEJOH/VNCFS.PEFM @Observable public class AddingNumbersModel { public var number1Value:

    Int public var number2Value: Int public var number3Value: Int public init(number1Value: Int, number2Value: Int, number3Value: Int) { self.number1Value = number1Value self.number2Value = number2Value self.number3Value = number3Value } }
  8. !0CTFSWBCMFΛ࢖ͬͨߋ৽ 4XJGU6* import SwiftUI import Shared struct ContentView: View {

    @Bindable var viewModel: AddingNumbersModel var body: some View { VStack { Text("SwiftUIBasedSample") Spacer() VStack(alignment: .trailing, spacing: 8) { TextField("", text: $viewModel.number1Text) .textFieldStyle(.roundedBorder).multilineTextAlignment(.trailing).frame(width: 97) TextField("", text: $viewModel.number2Text) .multilineTextAlignment(.trailing).textFieldStyle(.roundedBorder).frame(width: 97) HStack { Image(systemName: "plus") .imageScale(.large).foregroundStyle(.gray) TextField("", text: $viewModel.number3Text) .multilineTextAlignment(.trailing).textFieldStyle(.roundedBorder).frame(width: 97) } Divider() .frame(width: 131) Text("\(viewModel.number1Value + viewModel.number2Value + viewModel.number3Value)") } Spacer() Spacer() } .padding() } }
  9. !0CTFSWBCMFΛ࢖ͬͨߋ৽ J04ʙ import UIKit // embeded Observation framework in Foundation

    framework import Shared class ViewController: UIViewController { @IBOutlet weak var number1: UITextField! @IBOutlet weak var number2: UITextField! @IBOutlet weak var number3: UITextField! @IBOutlet weak var result: UILabel! let viewModel = AddingNumbersModel(number1Value: 1, number2Value:2, number3Value: 3) override func viewDidLoad() { super.viewDidLoad() } override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() result.text = "\(viewModel.number1Value + viewModel.number3Value + viewModel.number2Value)" } @IBAction func onChangeNumber1(_ sender: Any) { viewModel.number1Value = number1.numberValue } @IBAction func onChangeNumber2(_ sender: Any) { viewModel.number2Value = number2.numberValue } @IBAction func onChangeNumber3(_ sender: Any) { viewModel.number3Value = number3.numberValue } }
  10. !0CTFSWBCMFΛ࢖ͬͨߋ৽ J04ʙ import UIKit // embeded Observation framework in Foundation

    framework import Shared class ViewController: UIViewController { @IBOutlet weak var number1: UITextField! @IBOutlet weak var number2: UITextField! @IBOutlet weak var number3: UITextField! @IBOutlet weak var result: UILabel! let viewModel = AddingNumbersModel(number1Value: 1, number2Value:2, number3Value: 3) override func viewDidLoad() { super.viewDidLoad() } override func updateProperties() { super.updateProperties() result.text = "\(viewModel.number1Value + viewModel.number2Value + viewModel.number3Value)" } @IBAction func onChangeNumber1(_ sender: Any) { viewModel.number1Value = number1.numberValue } @IBAction func onChangeNumber2(_ sender: Any) { viewModel.number3Value = number3.numberValue } @IBAction func onChangeNumber3(_ sender: Any) { viewModel.number2Value = number2.numberValue } }
  11. !0CTFSWBCMFΛ࢖ͬͨߋ৽ J04ʙ import UIKit // embeded Observation framework in Foundation

    framework import Shared class ViewController: UIViewController { @IBOutlet weak var number1: UITextField! @IBOutlet weak var number2: UITextField! @IBOutlet weak var number3: UITextField! @IBOutlet weak var result: UILabel! let viewModel = AddingNumbersModel(number1Value: 1, number2Value:2, number3Value: 3) override func viewDidLoad() { super.viewDidLoad() } override func updateProperties() { super.updateProperties() result.text = "\(viewModel.number1Value + viewModel.number2Value + viewModel.number3Value)" } @IBAction func onChangeNumber1(_ sender: Any) { viewModel.number1Value = number1.numberValue } @IBAction func onChangeNumber2(_ sender: Any) { viewModel.number3Value = number3.numberValue } @IBAction func onChangeNumber3(_ sender: Any) { viewModel.number2Value = number2.numberValue } } .PEFMͷॳظ஋Λ֨ೲ͍ͯ͠ͳ͍ 4UPSZCPBSEʹೖͬͨ஋Λ࢖͍ͬͯΔ͚ͩ .PEFM΁ͷߋ৽͸6*,JUͷ··
  12. ΧελϜ4DFOFΛ࡞੒͢Δ import UIKit import SwiftUI import Shared class AddingNumbersSceneDelegate: UIResponder,

    UIHostingSceneDelegate { static let viewModel = AddingNumbersModel(number1Value: 1, number2Value: 2, number3Value: 3) static var rootScene: some Scene { WindowGroup(id: "addingNumbers") { ContentView(viewModel: viewModel) } } }
  13. "QQ%FMFHBUFͰಡΈࠐΉ4DFOFมߋ import UIKit @main class AppDelegate: UIResponder, UIApplicationDelegate { func

    application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Override point for customization after application launch. return true } // MARK: UISceneSession Lifecycle func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { let configuration = UISceneConfiguration(name: "AddingNumbers Configuration", sessionRole: connectingSceneSession.role) configuration.delegateClass = AddingNumbersSceneDelegate.self return configuration } func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) { } }
  14. ൵ใ͋ͷγϣʔτΧοτϘλϯ͕ফ͑ͨ "*ػೳ௥Ճ΍࣌୅ͷྲྀΕΑΔมߋ w /BWJHBUPSΛදࣔඇදࣔγϣʔτΧοτ w 㵰 ˠ$PEJOHBTTJTUBOU΁ w *OTQFDUPSTͷදࣔඇදࣔ w

    0QUJPO 㵰 ˠɹ<ͳ͠> w 4UPSZCPBSEͷ-JCSBSZදࣔϘλϯ w ഇࢭ 㵰 <>μϒϧλοϓ 0QUJPO 㵰 <>μϒϧλοϓ 4IJGU 㵰 -
  15. w 6*,JUͷ৽ػೳ88%$ w EFWFMPQFSBQQMFDPNKQ WJEFPTQMBZXXED w 4XJGU6*Ή͚ʹ੔ཧ͞Εͨঢ়ଶ؂ࢹ 0CTFSWBUJPO4QFBLFS%FDL w IUUQTTQFBLFSEFDLDPN

    OPUPSPJETXJGUVJNVLFOJ [IFOHMJTBSFUB[IVBOHUBJKJBO TIJPCTFSWBUJPO w ʲ6*,JUʳ6*)PTUJOH$POUSPMMFSΛ ࢖ͬͯ6*7JFX$POUSPMMFSͷதͰ 4XJGU6*ͷ7JFXΛදࣔ͢Δ/3*ω οτίϜ#MPH w IUUQTUFDIOSJOFUDPN FOUSZ TXJGUVJ@WJFX@JO@VJWJFXDPOUSPMMF S ࢀߟ OPUPSPJE4QFBLFS%FDL