【SwiftUI】忘れないようにファイル読み込みの基本
2023-01-17
氷翠です。
今回は前回に引き続きファイル関連ということで、テキストファイルの内容を読み込むというもの。前回と同じ設定をしておき、あとはプログラミングしていく。
今回のデザインは更に単純なものにする。
import SwiftUI
struct ContentView: View {
@ State var sampleText: String = "ここにデータが読み込まれます"
let fr = fileReadModel()
var body: some View {
VStack {
Button("テキストファイルの読み込み") {
sampleText = fr.readData()
}
TextEditor(text: $sampleText)
}
.padding()
}
}
ということで、プログラミングはこんな感じで簡素なものだ。
読み込むためトリガーになるボタンと、内容を表示するための「texteditor」。このTexteditorに内容が代入されることになる変数「sampleText」を設定しておく。
ボタンのアクションにはsampleTextに読み込んだデータを代入するというもの。
上の方で「let fr = fileReadModel()」というのがあるが、これはテキストファイルを読み込むクラスを設定しておく。そこでボタンの中のアクションにある「sampleText = fr.readData()」ということで、frのメソッド「readData()」を呼び出す。その返り値が「sampleText」に代入される。と同時に画面に表示されるようになります。
では次にそのクラス「fileReadModel()」です
import Foundation
class fileReadModel: ObservableObject {
let fm = FileManager.default
func readData() -> String {
var output = ""
guard let path = fm.urls(for: .desktopDirectory, in: .userDomainMask).first else {
fatalError("URL取得失敗")
}
let fullURL = path.appendingPathComponent("sample.txt")
do {
output = try String(contentsOf: fullURL, encoding: .utf8)
} catch {
output = "読み込み失敗"
}
return output
}
}
前回と同じように「ObservableObject」が設定されている。更に「let fm = FileManager.default」で短縮形を用意しておきます。
前回のファイルを保存するときと同じようなプログラムですが、違うのが「output = try String(contentsOf: fullURL, encoding: .utf8)」この部分。変数「output」に代入していますが、UTF-8のエンコードで大丈夫でしょう。
コメント:2件
-
まだswiftuiでアプリを作り始めた素人です。
1. sample.txtは、テキストエディタで作成してdesktopに登録
2.実行したら読み込み失敗と表示された。
3.チェックのため
let fullURL = path.appendingPathComponent(“sample.txt”)
の後に
if FileManager.default.fileExists(atPath: fullURL.path) {
// ファイルが存在する場合の処理
print(“sample.txtが存在します。”) }
で確認したら存在します。と表示
以上ですが、教えていただけると有り難い。
忙しいなかおねがいします。投稿日:2023/09/07(木) 17:45:54
名前:髙橋 和夫
-
自分も素人ですw
もちろん、これだけの情報ですと、まだはっきりとした回答はできませんが、
ファイルそのものが読み込み出来ない状態にあるとか、権限がないなど
また、その作成したURL型をコンソールに出力して、パスを確認してみてはいかがでしょうか?自分で失敗していた時は、「file://」がなかったり、大文字小文字がおかしかったりしていたときもあったので、
そんなほんのちっちゃいミスに気付かなかったりします。URL型で宣言しておいて、上記の「file://」がないこともありましたので、いろいろとコンソールで確認してみてはいかがでしょうか。
投稿日:2023/09/08(金) 08:11:00
名前:IceGreen
コメントを残す