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

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

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

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

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

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

1回答

2608閲覧

swiftでのViewControllerの複製

summer

総合スコア11

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

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

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2015/05/20 02:51

現在メモアプリのようなものを作っているのですが、TableView上で新たなセルを追加したり削除したりという機能やそこから新たな画面遷移する機能は実装できたのですが、iOS標準のメモアプリのように新たなセル?を追加したらその都度そのセルに対応する新たな画面が作成されるようなプログラムができません。

調べながら試行錯誤してみてはいるのですが未だに実装できていないので質問させていただきます。

ちなみに現在のコードです(セルに対応する新たな画面作成に関するコードは試行錯誤中なので省いています)

lang

1import UIKit 2 3class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 4 5 @IBOutlet weak var myTableView: UITableView! 6 7 var newTableView: UITableView! 8 9 let myItems: NSMutableArray = ["TEST1", "TEST2", "TEST3"] 10 11 override func viewDidLoad() { 12 super.viewDidLoad() 13 // Do any additional setup after loading the view, typically from a nib. 14 15 // 編集ボタンを追加. 16 self.navigationItem.rightBarButtonItem = self.editButtonItem() 17 18 // 編集中のセル選択を許可. 19 myTableView.allowsSelectionDuringEditing = true 20 21 //TableViewの背景色を変更 22 //self.myTableView.backgroundColor = UIColor.whiteColor() 23 24 } 25 26 override func didReceiveMemoryWarning() { 27 super.didReceiveMemoryWarning() 28 // Dispose of any resources that can be recreated. 29 } 30 31 /* 32 Cellの総数を返す 33 (実装必須) 34 */ 35 func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 36 return myItems.count 37 } 38 39 /* 40 Cellに値を設定する 41 (実装必須) 42 */ 43 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 44 45 let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell 46 47 // Cellに値を設定. 48 cell.textLabel?.text = "\(myItems[indexPath.row])" 49 50 return cell 51 } 52 53 func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool { 54 // Return false if you do not want the specified item to be editable. 55 return true 56 } 57 58 59 /* 60 編集ボタンが押された際に呼び出される 61 */ 62 override func setEditing(editing: Bool, animated: Bool) { 63 super.setEditing(editing, animated: animated) 64 65 // TableViewを編集可能にする 66 myTableView.setEditing(editing, animated: true) 67 68 // 編集中のときのみaddButtonをナビゲーションバーの左に表示する 69 if editing { 70 println("編集中") 71 let addButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.Add, target: self, action: "addCell:") 72 self.navigationItem.setLeftBarButtonItem(addButton, animated: true) 73 } else { 74 println("通常モード") 75 self.navigationItem.setLeftBarButtonItem(nil, animated: true) 76 } 77 } 78 79 /* 80 addButtonが押された際呼び出される 81 */ 82 func addCell(sender: AnyObject) { 83 println("追加") 84 85 // myItemsに追加. 86 myItems.addObject("new") 87 88 // TableViewを再読み込み. 89 myTableView.reloadData() 90 } 91 92 /* 93 Cellを挿入または削除しようとした際に呼び出される 94 */ 95 func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) { 96 97 // 削除のとき. 98 if editingStyle == UITableViewCellEditingStyle.Delete { 99 println("削除") 100 101 // 指定されたセルのオブジェクトをmyItemsから削除する. 102 myItems.removeObjectAtIndex(indexPath.row) 103 104 // TableViewを再読み込み. 105 myTableView.reloadData() 106 } 107 } 108 109 /* 110 Cellが選択された際に呼び出される. 111 112 func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 113 114 // 選択中のセルが何番目か. 115 println("Num: \(indexPath.row)") 116 117 // 選択中のセルのvalue. 118 println("Value: \(myItems[indexPath.row])") 119 120 // 選択中のセルを編集できるか. 121 println("Edeintg: \(tableView.editing)") 122 123 124}

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

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

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

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

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

guest

回答1

0

ベストアンサー

メモアプリ開発応援しています!

まず、新たな画面という認識ですがこれはcell毎にViewControllerが紐付けられているのではなく、cellにメモの内容が紐付けられており、その内容を共通のViewControllerに表示していると考えると良いと思います。
ViewControllerはメモの一覧を表示するものと、メモの内容を表示するものの2つで良いわけです。
タップ時にmyItems[indexPath.row]で取れるデータは、選択したcellの内容と同じなのでこのmyItems[indexPath.row]をメモを全文表示するViewControllerに渡してあげれば良いわけです。

投稿2015/05/20 03:08

noppefoxwolf

総合スコア231

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

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

summer

2015/05/20 03:57

素早い回答、応援ありがとうございます! そのような感じのコードを作ればいいわけですか。 そうなるとmyItems[indexPath.row]をUIViewControllerにキャストして遷移先のclassを代入すればいいのでしょうか(遷移先のインスタンスを作成)。僕が思いついたのはこの方法で今試しているところなのですが。 //Cellが選択された際に呼び出される. func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { //SecondViewController1のインスタンスを作成する. myItems[indexPath.row] = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("second") as! UIViewController // Viewの移動する. self.navigationController?.pushViewController(myItems[indexPath.row] as! UIViewController, animated: true) } 一応このように書いたのですが、方針は合っていますでしょうか。 合っていたとして各セル毎のデータの保存する方法がまだわかりませんが。
noppefoxwolf

2015/05/20 07:16

まず、`FirstViewController`と`SecondViewController`が必要です。 `FirstViewController`は投稿していただいた、一覧を表示するUITableViewの貼り付けてあるViewControllerです。 `SecondViewController`はメモを全文表示する画面です。 流れとしては、FirstViewControllerからSecondViewControllerへ表示する文字を渡します。 渡すためには、SecondViewControllerに`var memo:String?`を定義します。 そして、セルがタップされた時点で ```lang:ObjC let vc = SecondViewController() vc.memo = "\(myItems[indexPath.row])" self.navigationController?.pushViewController(vc, animated: true) ``` を実行します。 `let vc = SecondViewController()` の部分はSecondViewControllerを生成している部分です。 `vc.memo = "\(myItems[indexPath.row])"` ここで、生成したSecondViewController(インスタンスといいます。)に文字列を渡します。 `self.navigationController?.pushViewController(vc, animated: true)` 最後に、これはご存知かと思いますが画面を切り替えます。 あとは`SecondViewController`の`ViewDidLoad`等でUITextField等に受け取った文字列を貼り付ければ表示されるはずです。 またデータの永続化はNSUserDefaultという機能が分かりやすいかと思います。
noppefoxwolf

2015/05/20 07:24

因みにmyItems[] の中にUIViewControllerのインスタンスを入れるのは色々と(メモリだったり入れ替えの際も自分で管理しないといけないのでバグの温厚になります。)良くないので、なるべくやめたほうがいいかと思います。 確かにmyItemsの中にインスタンスを入れればタップ時にそこから呼び出して画面遷移が出来るのですが、一般的には呼び出す直前に生成します。 お節介かもしれないので、もしmyItemsの中にインスタンスを入れる方法で実装したい場合はコメント無視でお願いします!
summer

2015/05/20 14:07

回答ありがとうございます。 いや、そういう踏み込んだアドバイスはありがたいです!ただ回答していただいたコードとほぼ同じコードで実装してみたのですが、Labelなどが反映されず(Story Board上のものが反映されない)かつ遷移時に画面が黒くなり一度止まってしまうという変な挙動を起こしたため上記のようなコードにしました。この問題が解決できればいいのですが。 myItemsにインスタンスを入れた理由は、それぞれのセルの遷移先のデータ管理したくてmyItemsにしたのですがNSUserDefaultでそれぞれのセル毎のデータを作成できるのでしょうか(自分でも調べてみます)
noppefoxwolf

2015/05/20 15:56

もしStoryboardを使っているなら`let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("second") as! SecondViewController`としてみてください。
summer

2015/05/21 03:16

回答ありがとうございます。 ではmyItemsはやめて新たな定数にインスタンスを入れることにします。 NSUserDefaultはありがとうございました。これを使用します。 ただやはりまだわからない部分があって、 セル1を選択したらそれに対応するページ、セル2を選択したらそれに対応するページ・・・・とそれぞれのセルに対応することができていません。(具体例では、”動物”をクリックすれば動物に関するメモのしてあるページに、”スポーツ”をクリックすればスポーツに関するメモのしてあるページにといった具合にできません。) 説明下手ですいません。あと少し力を貸して欲しいです。
noppefoxwolf

2015/05/21 03:27

全く違う画面へ飛ばすならば indexpath.rowに何番目のセルがタップされたかが含まれるので、それを見て生成するViewControllerを切り替えると良いかとおもいます。 入れ替えが発生すると面倒だと思うので、myItemsには文字列と選択時の画面の種類を管理するオブジェクトを作って入れておくといいと思います。
summer

2015/05/21 04:13

回答ありがとうございます。 ふむふむ。 でも新しいセル(メモ)を作成したときに新しい遷移先を生成する必要がありますよね?それも対応できますでしょうか(本当説明下手ですいません)
noppefoxwolf

2015/05/21 04:27

SecondViewControllerは中身によって表示を変えるようにしてあるかとおもいます。 であれば、新規のセルをタップしたら空のSecondViewControllerが表示されるかと思いますが、それでは問題があるのでしょうか?
summer

2015/05/21 11:52

回答ありがとうございます。 今日1日コードの理解等に努めていました。まだ完全に理解はできていませんが。 ただこの部分 vc.memo = "\(myItems[indexPath.row]) が 'UIViewController' does not have a member named 'memo' となってしまいます。SecondViewControllerには宣言していますしこのエラーの原因がわからず苦戦しています。
noppefoxwolf

2015/05/21 11:55

vcの生成時に let vc:SecondViewController = ~ の様に、型を指定して生成してみてください
summer

2015/05/21 14:44

回答ありがとうございます。 試してみましたが 'UIViewController' is not convertible to 'SecondViewController1' こんなエラーがでてしまいます。
summer

2015/05/21 14:45

ちなみに'SecondViewController1'この部分は間違いではないです。
summer

2015/05/21 14:55

いやすいません、文字を渡すことには成功しました!ありがとうございます。 あとはメモの中身を永続化するだけですね。自分で考えてみますので、またわからなかったら助力お願いします!
noppefoxwolf

2015/05/21 15:02

let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("second") as! UIViewController にしていませんか…。
summer

2015/05/21 15:16

その勘違いでした。なんとか気づくことができました。 いろいろ助けていただいてとても感謝してます! あとはメモの内容を永続化することを頑張りたいと思います。 またわからなくなったら質問すると思うのですがそしたらまた助言していただけると幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問