質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

3回答

4176閲覧

1日1回しか押せないボタンを作りたい

hik_

総合スコア42

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

1グッド

0クリップ

投稿2020/04/15 07:41

編集2020/04/18 22:39

前提・実現したいこと

1日1回しか押せないボタンを作りたい。
毎日深夜0時にリセットされ、再び押されるようになるボタンを作りたいです。

試したこと

実装するために調べていて、どうやらDateというので日付を扱えるというのが分かったのですが、1日1回しか押せないような記事が無く、現在調べている状況です。
ご教示頂けると幸いです。
よろしくお願いします。

4/19追記

Buttonを押せなくするのを実装しようとしていたのですが、難しく。
Buttonを非表示にしようと以下のコードを書いているのですが、実装できない状態です
どなたかご教示頂けると幸いです。

import UIKit class ViewController: UIViewController { var hikaku = "" var hikakuTwo = "" var hikakuIF = true var hajime = true @IBOutlet var button: UIButton! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. //現在の日付を取得 let date:Date = Date() let format = DateFormatter() format.dateFormat = "yyyy/MM/dd" hikaku = format.string(from: date) print(hikaku) } override func viewDidAppear(_ animated: Bool) { if UserDefaults.standard.object(forKey: "hikakuKey") != nil { hikaku = UserDefaults.standard.object(forKey: "hikakuKey") as! String } if UserDefaults.standard.object(forKey: "hikakuIFKey") != nil { hikakuIF = UserDefaults.standard.object(forKey: "hikakuIFKey") as! Bool } if UserDefaults.standard.object(forKey: "hajimeKey") != nil { hajime = UserDefaults.standard.object(forKey: "hajimeKey") as! Bool } let date:Date = Date() let format = DateFormatter() format.dateFormat = "yyyy/MM/dd" hikaku = format.string(from: date) if hajime != false { hikakuTwo = format.string(from: date) UserDefaults.standard.set(hikakuTwo, forKey: "hikakuKey") hajime = false UserDefaults.standard.set(hajime, forKey: "hajimeKey") print("A") } else { if hikakuIF == true { hikakuTwo = format.string(from: date) UserDefaults.standard.set(hikakuTwo, forKey: "hikakuKey") hikakuIF = false print("B") } } if hikaku == hikakuTwo { button.isHidden = true print("ボタン非表示") } } @IBAction func button(_ sender: Any) { } }

補足情報(FW/ツールのバージョンなど)

Swift5 Xcode11

loving👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Q71

2020/04/15 08:08

どういう人が使う、 どれくらいの人に公開されるアプリで、 「1日1回」という条件を、どのレベルでかけるのでしょうか。
hik_

2020/04/18 22:39

公開はせず、試しに作っている状況になります。
guest

回答3

0

「1日1回しか押せないボタンの作り方」という、そのものずばりの記事はたぶん存在しないでしょうね。
例えば料理なら、「○○の作り方」の記事を読んで、そのまま何度も実行することには意味があります。その料理を食べたい時には、毎回誰かが作る必要があるので。
でも、プログラミングでは、「○○の作り方」を、そのまま何度も実行することにはほとんど意味がありません。まったく同じ手順で作れば、まったく同じプログラムができるわけですが、まったく同じプログラムなら、誰かが一度作ったものをインストールして実行するだけでいいので。
もちろん、プログラミングでも、いろんな「○○の作り方」の記事がありますが、これらはただそのまま実行するためにあるのではなく、そのひとつひとつの手順を部品として切り取って、アレンジしたり組み合わせたりすることに意味があります。

というわけで、「1日1回しか押せないボタンの作り方」に必要な部品を考えてみましょう。

  • 現在の日付 (と時刻) を調べる
  • (ボタンが押された時の) 日付 (と時刻) を記録する
  • 記録した (前回ボタンが押された時の) 日付 (と時刻) を取り出す
  • 二つの日付 (と時刻) が同じ日のものかどうかを比べる
  • 条件に応じてボタンを押せるように、または押せないようにする

これらひとつひとつのやり方は検索すれば出てくると思います。あとはそれらをどう組み合わせれば目的を達成できるかを考えて実行するのが、プログラムを作るという行為になります。

投稿2020/04/15 08:21

hoshi-takanori

総合スコア7895

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hik_

2020/04/18 22:40

ありがとうございます。 工夫してButtonを非表示にするという実装方法で試みているのですが、いまだ実装できていない状況です。 追記にコードを記載しました。 ご教示頂けると幸いです。
guest

0

押したときの日付を記録しておいて、同じ日付なら無視するようにすればいいのではないかと。

投稿2020/04/15 08:01

y_waiwai

総合スコア87784

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hik_

2020/04/18 22:40

ありがとうございます。 押した時の日付も記録するようコードを書いたのですが、 工夫してButtonを非表示にするという実装方法で試みているのですが、いまだ実装できていない状況です。 追記にコードを記載しました。 ご教示頂けると幸いです。
guest

0

ベストアンサー

/Library/Preferencesに今日の日付を保存して、押した時にそのファイルを参照して今日押したかを調べたらどうでしょうか。

ソースコード

Swift

1class ViewController: UIViewController { 2 3 @IBOutlet weak var OsenaiButton: UIButton! 4 5 let libPath = NSHomeDirectory() + "/Library/Preferences" 6 let dateFileName = "Date" 7 8 override func viewDidLoad() { 9 super.viewDidLoad() 10 // Do any additional setup after loading the view. 11 12 if FileManager().fileExists(atPath: libPath + dateFileName) { 13 OsenaiButton.isEnabled = true 14 if !data.getFileData(_ filePath: libPath + dateFileName) = date() { 15 OsenaiButton.isEnabled = false 16 } 17 } else { 18 OsenaiButton.isEnabled = false 19 } 20 } 21 22 func getFileData(_ filePath: String) -> Data? { 23 var fileData: Data? 24 do { 25 let fileUrl = URL(fileURLWithPath: filePath) 26 fileData = try Data(contentsOf: URL(fileURLWithPath: fileUrl)) 27 } catch { 28 fileData = nil 29 } 30 return fileData 31 } 32 33 func push() { 34 // MARK: ここに押した時の処理を記載 35 } 36 37 @IBAction func OsenaiButton(_ sender: Any) { // Outletでボタンと接続 38 if FileManager().fileExists(atPath: libPath + dateFileName) { 39 let data: Data? 40 if !data.getFileData(_ filePath: libPath + dateFileName) = date() { // 押せるなら 41 push() 42 OsenaiButton.isEnabled = true 43 let dateData: NSData = NSData(contentsOfFile: String(Date())) 44 data.write(toFile: libPath + dateFileName, atomically: true) 45 } 46 } else { // 押したのが初めてならここにくる 47 push() 48 OsenaiButton.isEnabled = true 49 let data: NSData = NSData(contentsOfFile: String(Date())) 50 data.write(toFile: libPath + dateFileName, atomically: true) 51 } 52 } 53 54}

でいけると思います。

仕組み
  • func getFileData(_ filePath:) -> Data?
  •  getFileData(_filePath:)関数では、ファイルの中身を取得します。

以下 このリンクから引用

Swiftでファイルのデータは、Dataクラスのオブジェクトとして読み込みます。

以下はその手順になります。

  1. ファイルパスを指定して、URLオブジェクトを作成します。
  2. 作成したURLオブジェクトを指定して、Dataオブジェクトを作成します。

手順2で、Dataオブジェクトの作成に失敗すると例外が発生するため、do-catchで処理します。

  • func push()

  •  push()関数のなかに、ボタンを押せた時の処理を書きます。

  • @IBAction func OsenaiButton(_ sender: Any)

  •  @IBAction func OsenaiButton()は、ボタンを押した時に実行されます。

投稿2020/04/20 06:10

編集2020/04/20 07:52
shuntar30

総合スコア80

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問