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

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

ただいまの
回答率

91.81%

  • Swift

    4073questions

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

  • iOS

    2473questions

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

  • Xcode

    2382questions

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

alerttextについて

解決済

回答 2

投稿 2017/01/07 13:45 ・編集 2017/01/08 01:04

  • 評価
  • クリップ 0
  • VIEW 192

blakekei

score 18

コード
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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

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などでソース管理というものを使えるようになると、一気にできることが増えるかもしれません。

投稿 2017/01/08 03:13

編集 2017/01/08 03:15

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

  • 2017/01/08 21:43 編集

    こちらのコードだと
    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    if sectionTitleArray.count == 0 {
    return nil
    } else {
    return sectionTitleArray[section]//ここの部分がエラー起きるのですがどうしたらいいですか?
    }
    }

    キャンセル

  • 2017/01/09 18:58

    コンソールのエラー文に英語でResonと書かれている場合は、そこの文章をコピーして翻訳して意味を知る。その英文をコピーしてネット検索をして同様なエラー文の解説がほとんどの場合はあるので、それをヒントに解決します。Resonが書かれていない場合は、文章的なところをひとつづつネットで調べますね。

    キャンセル

0

そちらのコードではelseの箇所が、{}など足りない箇所がありますので(他にもあるかもしれません。)、機能として必要な部分だけお伝えします。

実際に試したコードを記載します。

alert.addAction(cancelAction)の上にこちらを記載するとUITextFiledは、2行表示されます。

 alertController.addTextField { (textField : UITextField) -> Void in
 //コード
 }

UIAlertControlelrの2行にする方法

Q
[(1)と(個×)と(円)]のところは自動的に追加できるようにしたいです。
A
action in の下に

if let textFields = alertController.textFields {
                    let textFieldTwo = textFields[1]
}

textFieldTwoの変数に1行目のTextFildを表示する方法と同様に実施すれば対応できます。以前もセクション内にデータを記載する方法を回答させて頂きましたが、1行目で文字のデータ入力を理解すれば、2行目も同様に実施できると思います。

投稿 2017/01/08 00:30

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

    以下のような回答は評価を下げられます

    • 間違っている回答
    • 質問の回答になっていない投稿
    • 不快な投稿

    評価を下げる際はその理由をコメントに書き込んでください。

  • 2017/01/08 00:59

    action inってどの部分を指してますか?
    またrowの部分だけテキストアラートで入力してもデータが反映されないのですがどうしたいいでしょうか?

    キャンセル

  • 2017/01/08 19:00

    labelの内容がrowを追加した時に表示出来ないのはどこかにコードを書き足さなきゃいけないのでしょうか?

    キャンセル

  • 2017/01/08 20:20

    コードを書き足す前に、なぜlabelで入力した値が、画面に表示されると思いますか?この質問の答えが、コードを書き足す場合、コードを除く場合の答えになります。なので思考してください。

    キャンセル

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

ただいまの回答率

91.81%

関連した質問

同じタグがついた質問を見る

  • Swift

    4073questions

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

  • iOS

    2473questions

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

  • Xcode

    2382questions

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

閲覧数の多いiOSの質問