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

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

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

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

Q&A

解決済

2回答

5092閲覧

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

tlshi

総合スコア17

Swift

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

0グッド

2クリップ

投稿2015/10/15 09:44

編集2015/10/16 08:04

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

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

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

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

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

swift

1import UIKit 2 3class ViewController2: UITableViewController{ 4 5 // 講義名 6 private let titleCell = UITableViewCell() 7 private let titleField = UITextField() 8 // 講義内容 9 private let textCell = UITableViewCell() 10 private let textField = UITextView() 11 // 講義開始時間 12 private let textCell2 = UITableViewCell() 13 private let textField2 = UITextField() 14 15 override func viewDidLoad() { 16 super.viewDidLoad() 17 // titleCellへtitleFieldを子画面として登録 18 if (self.titleField.superview == nil) { 19 self.titleCell.contentView.addSubview(self.titleField) 20 self.titleCell.addTextEditor(self.titleField) 21 } 22 // textCellへtextFieldを子画面として登録 23 if (self.textField.superview == nil) { 24 self.textCell.contentView.addSubview(self.textField) 25 self.textCell.addTextEditor(self.textField) 26 } 27 // textCell2へtextField2を子画面として登録 28 if (self.textField2.superview == nil) { 29 self.textCell2.contentView.addSubview(self.textField2) 30 self.textCell2.addTextEditor(self.textField2) 31 } 32 } 33 34 override func didReceiveMemoryWarning() { 35 super.didReceiveMemoryWarning() 36 } 37 38 // セクション数を返す 39 override func numberOfSectionsInTableView(tableView: UITableView) -> Int { 40 return 3 41 } 42 43 // セクションごとの項目数を返す 44 override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 45 return 1 46 } 47 48 // 項目用のセルを返す 49 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 50 if (indexPath.section == 0) { 51 return self.titleCell 52 }else if (indexPath.section == 1){ 53 return self.textCell 54 }else{ 55 return self.textCell2 56 } 57 } 58 59 // ヘッダー 60 override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? { 61 if (section == 0) { 62 return "講義名" 63 }else if (section == 1){ 64 return "講義内容" 65 }else{ 66 return "講義開始時間" 67 } 68 } 69 70 // 項目ごとの高さ 71 override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 72 if (indexPath.section == 0) { 73 return 30 74 }else if (indexPath.section == 1){ 75 return 100 76 }else{ 77 return 30 78 } 79 } 80extension UITableViewCell { 81 // subViewをcontentViewプロパティに登録 82 func addTextEditor(subView:UIView) { 83 self.contentView.addSubview(subView) 84 self.selectionStyle = UITableViewCellSelectionStyle.None 85 subView.setTranslatesAutoresizingMaskIntoConstraints(false) 86 self.contentView.addConstraint(NSLayoutConstraint(item:subView, attribute:.Left,relatedBy:.Equal, toItem:self.contentView, attribute:.Left, multiplier:1, constant:0)) 87 self.contentView.addConstraint(NSLayoutConstraint(item:subView, attribute:.Right,relatedBy:.Equal, toItem:self.contentView, attribute:.Right, multiplier:1, constant:0)) 88 self.contentView.addConstraint(NSLayoutConstraint(item:subView, attribute:.Top,relatedBy:.Equal, toItem:self.contentView, attribute:.Top, multiplier:1, constant:5)) 89 self.contentView.addConstraint(NSLayoutConstraint(item:subView, attribute:.Bottom,relatedBy:.Equal, toItem:self.contentView, attribute:.Bottom, multiplier:1, constant:-5)) 90 } 91 92}

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

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

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

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

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

guest

回答2

0

UIDatePicker

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


内容の保存/読み出し

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

投稿2015/10/16 06:13

fuzzball

総合スコア16731

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

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

tlshi

2015/10/16 08:26

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

0

ベストアンサー

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

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

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

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

投稿2015/10/16 02:26

Unixer

総合スコア143

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

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

tlshi

2015/10/16 08:37 編集

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

2015/10/16 10:34 編集

以下のグローバル変数をクラス内に記述します。 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) }
tlshi

2015/10/16 19:09

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

2015/10/16 22:38

以下の内容をviewDidLoadメソッド内に追記するのはいかがでしょうか? formatter.locale = NSLocale(localeIdentifier: "ja_JP")
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問