コード
import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet weak var tableView: UITableView!
var sectionTitleArray = [String]()
var dataArray1 = ["個×"]
var dataArray2 = ["円"]
var dataArrayGroup: [[String]] = []
override func viewDidLoad() {
super.viewDidLoad()
dataArrayGroup = [dataArray1, dataArray2]
tableView.estimatedRowHeight = 44
tableView.rowHeight = UITableViewAutomaticDimension
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")
}
// Sectionを追加する(アニメーションはご自由に)
@IBAction func addSection(_ sender: Any) {
//func addSection() {
let alert = UIAlertController(title:"タイトル",
message: "メッセージ",
preferredStyle: .alert)
let cancelAction = UIAlertAction(title: "Cancel",
style: .cancel,
handler:
{ action -> Void in
print("Cancel")
})
let defaultAction = UIAlertAction(title: "OK",
style: .default,
handler:
{ action -> Void in
// TextFieldから値を取得
if let textFields = alert.textFields {
for textField in textFields {
if let text = textField.text, !text.isEmpty {
// 取得したテキストをセクションのタイトルとして追加する
print(text)
self.sectionTitleArray.insert(text, at: 0)
self.dataArrayGroup.insert([], at: 0)
self.tableView.insertSections(IndexSet(integer: 0), with: .automatic)
}
}
}
})
alert.addAction(cancelAction)
alert.addAction(defaultAction)
alert.addTextField(configurationHandler: { text -> Void in
})
present(alert, animated: true, completion: nil)
}
@IBAction func deleteSection(_ sender: Any) {
if sectionTitleArray.isEmpty {
return
}
sectionTitleArray.remove(at: 0)
dataArrayGroup.remove(at: 0)
tableView.deleteSections(IndexSet(integer: 0), with: .automatic)
}
@IBOutlet weak var deletetext: UITextField!
// Rowを追加する(アニメーションはご自由に)
@IBAction func addRow(_ sender: Any) {
//func addRow() {
if dataArrayGroup.count == 0 {
return
}
let center = dataArray1.count //真ん中に自動的にデータが追加される
let right = dataArray2.count //右端に自動的にデータが追加せる
let count = dataArrayGroup[0].count //左端にrowが増える度に1.2.3とカウントされながらデータが追加される
self.dataArrayGroup[0].insert(String(count), at: count)
self.tableView.insertRows(at: [IndexPath(row: count, section: 0)], with: .automatic)
let alert = UIAlertController(title:"タイトル",
message: "メッセージ",
preferredStyle: .alert)
let cancelAction = UIAlertAction(title: "Cancel",
style: .cancel,
handler:
{ action -> Void in
print("Cancel")
})
let defaultAction = UIAlertAction(title: "OK",
style: .default,
handler:
{ action -> Void in
// TextFieldから値を取得
if let textFields = alert.textFields {
else if textFields = alert.textFields {
for textField in textFields {
for textField in texFields {
}
if let text = textField.text, !text.isEmpty {
// 取得したテキストをセクションのタイトルとして追加する
print(text)
}
}
}
}
})
alert.addTextField { (textField : UITextField) -> Void in
alert.addAction(cancelAction)
alert.addAction(defaultAction)
alert.addTextField(configurationHandler: { text -> Void in
})
}
present(alert, animated: true, completion: nil)
}
// MARK: - TableView Delegate & DataSource
//この部分です。
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
if sectionTitleArray.count == 0 {
return nil
} else {
return sectionTitleArray[section]
}
}
// Section Count
func numberOfSections(in tableView: UITableView) -> Int {
return dataArrayGroup.count
}
// Row Count
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return dataArrayGroup[section].count
}
// Generate Cell
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath as IndexPath)
let dataArray = dataArrayGroup[indexPath.section]
cell.textLabel?.text = dataArray[indexPath.row]
return cell
}
// Select Cell
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath as IndexPath, animated: true)
}
func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == UITableViewCellEditingStyle.delete {
dataArrayGroup[indexPath.section].remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.automatic)
}
}
//cellが削除が可能なことを伝える
func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCellEditingStyle {
return UITableViewCellEditingStyle.delete;
}
}
自分の意図としてはrowがボタンによって追加され時に[1 3 個× 300 円]にしたくコードを書き換えて見たのですがエラーが起きました
[(3)と(300)]のところはアラートにテキスト2行を用意して入力出来るようにし、[(1)と(個×)と(円)]のところは自動的に追加できるようにしたいです。
alertを2行まで用意できたのですが入力したデータが反映されないですがどうしたらいいでしょうか?
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
こちらのコードでひとまず、アラートの入力が1行目と2行目も入力できます。
しかし各行に文字列を代入処理をしているため、片方の行を入力しても空白の欄が出力されます。
それと、同じ処理を記入しているself.tableView.reloadData()など1行でも良い書き方があるかもしれません。
完全に出来上がっているコードのみを渡すとAppStore申請まで行き着く場合は、逆に時間がかかります。
理由は全部聞かないとわからないからです。
機能をシンプルにして、対応方法を考えてみてほしいです。
それとループ処理なども調べ、理解、実装を続けると、よりできるようになると思いました。
// Rowを追加する(アニメーションはご自由に)
@IBAction func addRow(_ sender: UIBarButtonItem) {
// アラートビューにテキストフィールドを追加
let alertController = UIAlertController(title: "", message: "商品名と数字を入力してください", preferredStyle: .alert)
alertController.addTextField(configurationHandler: nil)
let otherAction = UIAlertAction(title: "OK", style: .default) {
action in
if let textFields = alertController.textFields {
let textField = textFields[0]
self.dataArrayGroup.append([textField.text!])
// 取得したテキストをセクションのタイトルとして追加する
self.tableView.reloadData()
}
if let textFields = alertController.textFields {
let textField = textFields[1]
self.dataArrayGroup.append([textField.text!])
// 取得したテキストをセクションのタイトルとして追加する
self.tableView.reloadData()
}
}
alertController.addTextField { (textField1 : UITextField) -> Void in
}
alertController.addAction(otherAction)
present(alertController, animated: true, completion: nil)
}
あとすみません。毎回微妙にコードが変化しているので、実施しようとする事が余計に難しくなっています。
それと実施したい機能をもっとシンプルな実装にすると、考えやすいです。
例えばですが、、
マスターソースは全部の機能があるもの。
各機能ごとにコードを実装しているソースに分けると考えも、まとまりやすいと思います。
機能が出来上がったらマスターソースに結合していくとアプリ開発ももっと効率的になると思います。
自らのタイミングの良い時でもSourceTreeなどでソース管理というものを使えるようになると、一気にできることが増えるかもしれません。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
そちらのコードではelseの箇所が、{}など足りない箇所がありますので(他にもあるかもしれません。)、機能として必要な部分だけお伝えします。
実際に試したコードを記載します。
alert.addAction(cancelAction)の上にこちらを記載するとUITextFiledは、2行表示されます。
alertController.addTextField { (textField : UITextField) -> Void in
//コード
}
Q
[(1)と(個×)と(円)]のところは自動的に追加できるようにしたいです。
A
action in の下に
if let textFields = alertController.textFields {
let textFieldTwo = textFields[1]
}
textFieldTwoの変数に1行目のTextFildを表示する方法と同様に実施すれば対応できます。以前もセクション内にデータを記載する方法を回答させて頂きましたが、1行目で文字のデータ入力を理解すれば、2行目も同様に実施できると思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.09%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/01/08 21:42 編集
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
if sectionTitleArray.count == 0 {
return nil
} else {
return sectionTitleArray[section]//ここの部分がエラー起きるのですがどうしたらいいですか?
}
}
2017/01/09 18:58