【お知らせ】
SwiftUIで作った macOS Todo アプリ
ToDone
を100ダウンロードまで無料にしました。マニュアルページは、ToDone サポートページ です。
【本文】
この章では、ボタンを使ってアプリケーションに処理(機能)を追加します。
@Stateをつけて宣言したプロパティは、その値を変更すると、その値を利用したビュー(View、GUI部品)の値も変わるという便利なものです。また、SwiftUI において、View をどのように配置していくかについては、全章にわたって例を示していきたいと思います。
このコーナーでは、任意のテキストエディタでコードを記述し、 ターミナルを使ってビルドする方法で作業を進めています。Xcode で作業を進める場合は、Xcodeで作業する場合 をご一読ください。
なお、ターミナルを使って作業を進める場合でも、Swift コンパイラや SwiftUI フレームワークなどを Mac にインストールするために Xcode をインストールして、一度起動させなければなりません。インストールが終われば Xcode は終了しても大丈夫です。
また、作成したアプリケーションを App Storeに提出するためのファイルにするには、 Xcode を使わなければならなかったかもしれません。どこかで Xcode を使わずに作る方法を見たような気もするのですが...
私の開発環境は次のとおりです。
更新履歴
2022/07/11 詳しいコード説明をつけました。
この章では、ボタンとレイアウトについて説明します。
なお、以前は Sub.swift というファイル名でしたが、View.swift というファイル名で統一することにしました。View.swift を次のように書き換えてください。Xcode で作業する場合は、ContentView(ContentView.swift)を次のように書き換えてください。
import SwiftUI
var count = 0
struct ContentView: View {
// num プロパティ(メンバ変数)を @Stateをつけて宣言します。
@State var num = "0"
var body: some View {
VStack {
Spacer()
// Text に設定する文字を @State を付けた num にします。
Text(num)
.font(.largeTitle)
.fontWeight(.ultraLight)
Spacer()
HStack {
Spacer()
Button(action: {
count -= 1
// num の値を変更すると Text に表示される文字列も自動で変わります。
num = String(count)
}) {
Text("-")
.frame(maxWidth: 70, maxHeight: 24)
}
Button(action: {
count += 1
num = String(count)
}) {
Text("+")
.frame(maxWidth: 70, maxHeight: 24)
}
}
}
.padding(10)
.frame(minWidth: 300, maxWidth: .infinity, minHeight: 200, maxHeight: .infinity)
}
}
以前は、Main.swift というファイル名でしたが、App.swift というファイル名で統一することにしました。Xcode で作業する場合は、プロダクト名App(プロダクト名App.swift)に次のコードを記述してください。
import SwiftUI
@main
struct FooApp: App {
@NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
class AppDelegate: NSObject, NSApplicationDelegate {
func applicationShouldTerminateAfterLastWindowClosed(_ sender: NSApplication) -> Bool {
return true
}
}
アプリケーションの名前を変えるために、Info.plist の CFBundleName を書き換えます。ここでは「Counting」という名前にしました。 Xcode で作業している場合は、ここは無視してください。 機会があれば、 また説明します。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"https://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleExecutable</key>
<string>foo</string>
<key>CFBundleIconFile</key>
<string>icon-macbook.icns</string>
<key>CFBundleName</key>
<string>Counting</string>
</dict>
</plist>
swiftc MApp.swift View.swift -o foo
mv foo Foo.app/Contents/MacOS
+ ボタンをクリックすると数がひとつ増えて、 - ボタンをクリックすると数がひとつ減ります。
ウィンドウを拡大しても、ボタンの位置は常に右下に表示されます。次のようなものも良いかもしれません。
import SwiftUI
var count = 0
struct ContentView: View {
@State var num = "0"
var body: some View {
VStack {
Text(num)
.font(.largeTitle)
.fontWeight(.ultraLight)
.foregroundColor(.white)
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(.green)
HStack {
Spacer()
Button(action: {
count -= 1
num = String(count)
}) {
Text("-")
.frame(maxWidth: 70, maxHeight: 24)
}
Button(action: {
count += 1
num = String(count)
}) {
Text("+")
.frame(maxWidth: 70, maxHeight: 24)
}
}
}
.padding(10)
.frame(minWidth: 300, maxWidth: .infinity, minHeight: 200, maxHeight: .infinity)
}
}