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

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

ただいまの
回答率

90.00%

swiftにおける学校の時間割アプリ

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 2,281

tlshi

score 15

swift初心者ですが、現在swiftを用いて学校の時間割アプリを作っています。
内容としては、ViewControllerクラスに配置したUIボタン(月曜から金曜までの1~6限の36個)のどれかを押すと、それに応じてViewController2クラスに遷移して、UIテーブルビューに置かれたUIテキストビューから各項目(授業名、授業メモ、授業開始時間など)を編集できるようにするものです。

現段階では、ViewControllerクラスからViewController2クラスへのボタンによる画面遷移と、テーブルビューに授業名と授業メモを編集できるUIテキストビューの配置までが終わっています。

しかし、UIテーブルビューにUIDatePickerを配置し、授業開始時間を設定することと、ViewController2クラスの内容の保存と読み出しの実装方法がまったくわからず困っています。理想としては、ViewControllerクラスのボタンのタップによる遷移時に値の読み出し、ViewController2クラスで各項目の編集をして、前の画面に戻る際に値の保存をしたいと考えています。

お手数だとは思いますが、どのように実装すればよいか教えていただきたいです。


追記:遷移先のクラスです。講義開始時間のセルからdatepickerで値を入力させたいのと、元のクラスに戻る際(具体的にはviewWillDisappear)に各情報を保存させたいです。
import UIKit

class ViewController2: UITableViewController{
     
    //  講義名
    private let titleCell = UITableViewCell()
    private let titleField = UITextField()
    //  講義内容
    private let textCell = UITableViewCell()
    private let textField = UITextView()
    //  講義開始時間
    private let textCell2 = UITableViewCell()
    private let textField2 = UITextField()
    
    override func viewDidLoad() {
        super.viewDidLoad()     
    //  titleCellへtitleFieldを子画面として登録
    if (self.titleField.superview == nil) {
         self.titleCell.contentView.addSubview(self.titleField)
         self.titleCell.addTextEditor(self.titleField)
        }    
    //  textCellへtextFieldを子画面として登録
     if (self.textField.superview == nil) {
         self.textCell.contentView.addSubview(self.textField)
         self.textCell.addTextEditor(self.textField)
        }    
    //   textCell2へtextField2を子画面として登録
     if (self.textField2.superview == nil) {
         self.textCell2.contentView.addSubview(self.textField2)
         self.textCell2.addTextEditor(self.textField2)
        }
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
   
    //  セクション数を返す
    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 3
    }
    
    //  セクションごとの項目数を返す
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }
    
    //  項目用のセルを返す
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        if (indexPath.section == 0) {
            return self.titleCell
        }else if (indexPath.section == 1){
            return self.textCell
        }else{
            return self.textCell2
        }
    }
    
    //  ヘッダー
    override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        if (section == 0) {
            return "講義名"
        }else if (section == 1){
            return "講義内容"
        }else{
            return "講義開始時間"
        }
    }
    
    //  項目ごとの高さ
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        if (indexPath.section == 0) {
            return 30
        }else if (indexPath.section == 1){
            return 100
        }else{
            return 30
        }
    }
extension UITableViewCell {
    //  subViewをcontentViewプロパティに登録
    func addTextEditor(subView:UIView) {
        self.contentView.addSubview(subView)
        self.selectionStyle = UITableViewCellSelectionStyle.None 
        subView.setTranslatesAutoresizingMaskIntoConstraints(false)
        self.contentView.addConstraint(NSLayoutConstraint(item:subView, attribute:.Left,relatedBy:.Equal, toItem:self.contentView, attribute:.Left, multiplier:1, constant:0))
        self.contentView.addConstraint(NSLayoutConstraint(item:subView, attribute:.Right,relatedBy:.Equal, toItem:self.contentView, attribute:.Right, multiplier:1, constant:0))
        self.contentView.addConstraint(NSLayoutConstraint(item:subView, attribute:.Top,relatedBy:.Equal, toItem:self.contentView, attribute:.Top, multiplier:1, constant:5))
        self.contentView.addConstraint(NSLayoutConstraint(item:subView, attribute:.Bottom,relatedBy:.Equal, toItem:self.contentView, attribute:.Bottom, multiplier:1, constant:-5))
    }
   
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

>UIテーブルビューにUIDatePickerを配置し、授業開始時間を設定すること

UITableViewCellの中にUITextFieldを配置し、通常は下からせり上がってくる仮想キーボードの代わりにUIDatePickerを表示させるという方法があります。Datepickerの中から何かのアイテムを選択すると、その内容がUITextFieldに反映されます。

>ViewController2クラスの内容の保存と読み出しの実装方法

学校の時間割アプリということですから、保存した内容はアプリを停止した後にも残っている必要があるデータ(不揮発性のデータといいます)ですね。そうなるとデータベース(sqlite)を使用するというのが良いかもしれません。iOSでsqliteを利用する際には、CoreDataというフレームワークを使用してデータベースを操作することができます。これは少し敷居が高いのですが、良い学習になると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/16 17:36 編集

    ご回答ありがとうございます。datepickerの方は、具体的にどのような処理を加えればよいのですか?

    キャンセル

  • 2015/10/16 19:29 編集

    以下のグローバル変数をクラス内に記述します。

    var toolBar = UIToolbar()
    var formatter = NSDateFormatter()

    以下の内容をviewDidLoadメソッド内に記述します。

    formatter.dateFormat = "yyyy/MM/dd"
    toolBar.barStyle = UIBarStyle.Default
    toolBar.sizeToFit()

    let spacer:UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: self, action: nil)
    let doneButton:UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Done, target: self, action: "closePicker:")
    let toolBarItems = [spacer,doneButton]
    toolBar.setItems(toolBarItems, animated: true)

    以下の内容を func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath:NSIndexPath) -> UITableViewCell メソッド内に追記します。

    //ストーリーボードでUITableViewを使用している場合、
    //"attributes inspector"の欄からUITextFieldに任意のタグ番号をつけてください。
    let textView = cell.contentView.viewWithTag("タグ番号") as! UITextView

    let datePicker = UIDatePicker()
    datePicker.datePickerMode = UIDatePickerMode.Date
    textField.inputView = datePicker
    textField.inputAccessoryView = toolBar
    datePicker.addTarget(self, action: Selector("handleDatePicker:"), forControlEvents: UIControlEvents.ValueChanged)

    以下のメソッドをクラス内のいずれかの部分に記述します。

    func closePicker(){
    textField.resignFirstResponder()
    }

    func handleDatePicker(sender: UIDatePicker) {
    textField.text = formatter.stringFromDate(sender.date)
    }

    キャンセル

  • 2015/10/17 04:09

    ありがとうございます、無事DatePickerの配置ができました。
    重ねて質問なのですが、UIDatePickerMode.timeによる表示だと、13:00のような時間設定ができず、PM1:00のようになってしまうようです。データを保存する際、または13:00にアラートを出すような機能を付け加える場合、AM・PMをどのように識別したらよいのでしょうか?

    キャンセル

  • 2015/10/17 07:38

    以下の内容をviewDidLoadメソッド内に追記するのはいかがでしょうか?

    formatter.locale = NSLocale(localeIdentifier: "ja_JP")

    キャンセル

+1

UIDatePicker

何がどう分からないのか、もう少し具体的に質問していただかないと、なかなか回答しづらいです。(というか、一から書き始めるのは面倒くさい)


内容の保存/読み出し

NSUserDefaultsを使ってデータを永続化します。
永続化なんて言うと判りにくいかも知れませんが、ゲームなんかで言うところのセーブ/ロードみたいなものです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/16 17:26

    セルに配置されたテキストフィールドの編集をdatepickerを用いて行いたいのと、データの保存と管理(引き出す際にどのように区別するか)の方法を教えていただきたいです。
    NSUserDefaultsも調べてみたのですが、いまいちどのように扱えばよいかわかりませんでした。

    キャンセル

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

  • ただいまの回答率 90.00%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる