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

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

ただいまの
回答率

89.23%

xibで作成したaletで入力したものをtableViewに横一列に表示させたい。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 817
退会済みユーザー

退会済みユーザー

ViewController.swift

import UIKit

class ViewController: UIViewController,UIPickerViewDelegate,UIPickerViewDataSource{

  @IBOutlet weak var mytableView: UITableView!
  var pickerView = UIPickerView()
  let number = ["回","lep"]
  let datalist2 = ["kg","lbs"]
  @IBAction func customalertbtr(_ sender: Any) {
   let customAlert = CustomAlert(frame: CGRect(x: 0.0, y: 0.0, width: 350 , height: 275))
    customAlert.center = self.view.center
    customAlert.backgroundColor = .orange
    //print(customAlert) //これ追加
    self.view.addSubview(customAlert)
  }

  override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
  }

  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
  }


}


CustomAlert.swift

import UIKit

class CustomAlert: UIView ,UIPickerViewDataSource,UIPickerViewDelegate {

  //lepsに関して
  let item = ["-5","-4","-3","-2","-1","0","1","2","3","4","5",]

  @IBOutlet var myview: UIView!
  @IBOutlet weak var titlelbl: UILabel!
  @IBOutlet weak var exlbl: UILabel!
  @IBOutlet weak var lepstxt: UITextField!
  @IBOutlet weak var kgtxt: UITextField!
  @IBOutlet weak var lepslbl: UILabel!
  @IBOutlet weak var lepspicker: UIPickerView!

  @IBAction func kglbs(_ sender: Any)
  {
    switch (sender as AnyObject).selectedSegmentIndex {
    case 0:
      //mytableView.text = "kg"
      print("kg")
    case 1:
      //mytableView.text = "lbs"
      print("lbs")
    default: break
   }
  }

  @IBAction func difficulty(_ sender: Any)
  {
    switch (sender as AnyObject).selectedSegmentIndex {
    case 0:
      kgtxt.textColor = UIColor.blue
    case 1:
      kgtxt.textColor = UIColor.red
    case 3:
      kgtxt.textColor = UIColor.darkGray
    default: break
   }
  }




  //コードから
  override init(frame: CGRect) {
    super.init(frame: frame)
    self.commonInit()
  }

  //ストボーから
  required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    self.commonInit()
  }

  fileprivate func commonInit() {

    guard let view = UINib(nibName: "CustomAlert", bundle: nil).instantiate(withOwner: self, options: nil).first as? UIView else {
      return
    }

    //textfieldに関して
    lepstxt.placeholder = "個数を入力してください。"
    kgtxt.placeholder = "値段を入力してください。"
    lepstxt.font = UIFont(name: "Hiragino Sans", size: 11)
    kgtxt.font = UIFont(name: "Hiragino Sans", size: 11)

    //デリゲート設定
    lepspicker.delegate = self
    lepspicker.dataSource = self
    //lepspicker.selectedRow(inComponent: 6)
    //lepspicker.backgroundColor = .gray

    view.frame = self.bounds

    self.addSubview(view)

  }

  @IBAction func cancel(_ sender: Any) {
    self.removeFromSuperview()
  }
  @IBAction func ok(_ sender: Any) {

    let item = lepstxt.text
    let array = kgtxt.text
    lepslbl.text = String()
    //mytbleView.text = String(item,array)
  }


  // PickerViewの列数
  func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
  }

  // PickerViewの行数
  func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return item.count
  }

  // PickerViewの項目
  func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    return item[row]
  }

  // PickerViewの項目選択時
  func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

  }


}

イメージ説明

やりたいこと
alertで内で入力した二つのtextfieldとlabelとsegmentで選択した文字を横一列に反映させたい。

困っていること
ViewController.swiftにあるtableViewのoutletをCustomAlert.swift内に書こうとすると[Use of unresolved identifier 'mytbleView']とエラーが表示される。
通常のアラートなら入力したものをtableViewに反映させれるのですがxibを使ったやり方はどこのサイトで調べてもそのような記述がなかったのでやり方が分からなくて困っています。

イメージとしては
りんごが1(個) 100[円]
マンゴが2(個) 50[ドル]
のように表示させたい。
()がlabel []がsegment 後はtextfieldです

@IBAction func ok(_ sender: Any) {
    let name1 = lepstxt.text
    //let name2 = lepspicker.textInputMode
    let name3 = "個"
    let name4 = "×"
    let name5 = kgtxt.text


    lepstxt.text = String()
    kgtxt.text = String()
    print(name1! + name3 + name4 + name5!)
    let str = "print"
    delegate?.appendData(str: str) // ViewControllerのメソッドを実行
    self.removeFromSuperview()
  }

イメージ説明

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

appendData()に色情報を加えたバージョンです。
(回答1の続きです。なんか追記したらエラー出て更新できなかったので、、、)

ViewController.swift

import UIKit

/*
 PickerViewは乗ってないからUIPickerViewDelegate,UIPickerViewDataSourceはいらない
 */
class ViewController: UIViewController /*,UIPickerViewDelegate,UIPickerViewDataSource*/ {

  // 文字列と色情報を持つAlertDataという構造体
    struct AlertData {
        var str:String!
        var color:UIColor!
    }

    //var data:[String]  = []
    var data:[AlertData] = []

    @IBOutlet weak var mytableView: UITableView!

//    var pickerView = UIPickerView()
//    let number = ["回","lep"]
//    let datalist2 = ["kg","lbs"]

    @IBAction func customalertbtr(_ sender: Any) {
        let customAlert = CustomAlert(frame: CGRect(x: 0.0, y: 0.0, width: 350 , height: 275))
        customAlert.center = self.view.center
        customAlert.backgroundColor = .orange

        // ViewControllerの参照をセット
        customAlert.delegate = self

        //print(customAlert) //これ追加
        self.view.addSubview(customAlert)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        mytableView.dataSource = self
        mytableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

// データ・ソース
extension ViewController: UITableViewDataSource {

    // データ数
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return data.count
    }

    // セクション数
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    // セルの高さ
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 40
    }

    // セル生成
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        cell.textLabel?.text = data[indexPath.row].str
        cell.textLabel?.textColor = data[indexPath.row].color

        return cell
    }
}

extension ViewController: CustomAlertDelegate {
    func appendData(str:String,color:UIColor) {
        // CustomAlertで作成した文字列をデータに追加
        //data.append(str)

        var alertData = AlertData()
        alertData.str = str
        alertData.color = color

        data.append(alertData)

        // tableViewをリロード
        mytableView.reloadData()

    }
}

CustomAlert.swift

import UIKit

// プロトコル
protocol CustomAlertDelegate {
    // func appendData(str:String)
    func appendData(str:String,color:UIColor)
}

class CustomAlert: UIView ,UIPickerViewDataSource,UIPickerViewDelegate {

    //lepsに関して
    let item = ["-5","-4","-3","-2","-1","0","1","2","3","4","5",]
    var lepsSelectedIndex = 0

    let kgLbsArr = ["円","ドル"]
    var kgLbsSelectedIndex = 0

    let difficulityArr = ["安い","普通","高い"]
    var difficulitySelectedIndex = 0

    var delegate:CustomAlertDelegate? // 他クラス(今回はViewController)の参照を格納するための変数

    @IBOutlet var myview: UIView!
    @IBOutlet weak var titlelbl: UILabel!
    @IBOutlet weak var exlbl: UILabel!
    @IBOutlet weak var lepstxt: UITextField!
    @IBOutlet weak var kgtxt: UITextField!
    @IBOutlet weak var lepslbl: UILabel!
    @IBOutlet weak var lepspicker: UIPickerView!

    @IBAction func kglbs(_ sender: Any)
    {
        switch (sender as AnyObject).selectedSegmentIndex {
        case 0:
            //mytableView.text = "kg"
            print("kg")
        case 1:
            //mytableView.text = "lbs"
            print("lbs")
        default: break
        }

        kgLbsSelectedIndex = (sender as! UISegmentedControl).selectedSegmentIndex
    }

    @IBAction func difficulty(_ sender: Any)
    {
        switch (sender as AnyObject).selectedSegmentIndex {
        case 0:
            kgtxt.textColor = UIColor.blue
        case 1:
            kgtxt.textColor = UIColor.red
        case 2: //3:
            kgtxt.textColor = UIColor.darkGray
        default: break
        }

        difficulitySelectedIndex = (sender as! UISegmentedControl).selectedSegmentIndex
    }

    //コードから
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.commonInit()
    }

    //ストボーから
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.commonInit()
    }

    fileprivate func commonInit() {

        guard let view = UINib(nibName: "CustomAlert", bundle: nil).instantiate(withOwner: self, options: nil).first as? UIView else {
            return
        }

        //textfieldに関して
        lepstxt.placeholder = "個数を入力してください。"
        kgtxt.placeholder = "値段を入力してください。"
        lepstxt.font = UIFont(name: "Hiragino Sans", size: 11)
        kgtxt.font = UIFont(name: "Hiragino Sans", size: 11)

        //デリゲート設定
        lepspicker.delegate = self
        lepspicker.dataSource = self
        //lepspicker.selectedRow(inComponent: 6)
        //lepspicker.backgroundColor = .gray

        view.frame = self.bounds

        self.addSubview(view)

    }

    @IBAction func cancel(_ sender: Any) {
        self.removeFromSuperview()
    }
    @IBAction func ok(_ sender: Any) {

        let lepsVal = lepstxt.text
        let kgtVal = kgtxt.text
        let lepsLbl = lepslbl.text
        let num = item[lepsSelectedIndex]
        //mytbleView.text = String(item,array)

        let cellString = lepsVal! + "が" + num + "(" + lepsLbl! + ")" + " " + kgtVal! + "[" + kgLbsArr[kgLbsSelectedIndex] + "]" + " " + difficulityArr[difficulitySelectedIndex]

        // テキストと色を渡す
        delegate?.appendData(str: cellString,color: kgtxt.textColor!)

        self.removeFromSuperview()
    }

    // PickerViewの列数
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    // PickerViewの行数
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return item.count
    }

    // PickerViewの項目
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return item[row]
    }

    // PickerViewの項目選択時
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        lepsSelectedIndex = row
    }

}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/02/19 19:27

    delegate?.appendData(str: cellString,color: kgtxt.textColor!)このようにすると以下のエラーが出現します。Extra argument 'color' in call
    このエラーの場合、直訳するとcolorが余計っていうことですよね?なので色々パターンを試してみたのですがエラーを改善出来ませんでした。
    それと仮にkgtxt,textColorで実行できても色が変わるのってkgtxt.textColorだけだと思うのですが一行全体の色を変える場合はcellStringに変えればいいのでしょうか?

    キャンセル

  • 2018/02/19 19:29

    全体をよく見てくださいねー

    キャンセル

  • 2018/02/19 21:31

    // ViewControllerの参照をセット
    customAlert.delegate = self
    この部分でエラーが出ていたのですが 
    Cannot assign value of type 'ViewController' to type 'CustomAlertDelegate?'

    class ViewController: UIViewController,UIPickerViewDelegate,UIPickerViewDataSource,UITableViewDelegate,UITableViewDataSource,CustomAlertDelegate{
    このようにしたらエラーが取れました。
    やり方としてはあっていますでしょうか?
    それとあまりextension ViewController: UITableViewDataSource の使い方・意味が分からなかったのでclassの中に纏めたのですが適切では無いんでしょうか?
    一応私個人としてのやりたい事は実現できたのですがもし適切でなければ何故適切では無いのかをご教授して頂けたら幸いです。
    本当に何から何までご丁寧に教えて頂きありがとうございました。

    キャンセル

+1

横一列の情報をつくる → CustomAlert
横一列の情報をテーブルに表示 → ViewController

上記を踏まえ、ViewControllerのメソッドをCustomAlertから実行する仕掛けの例です。

ViewController.swift

  @IBAction func btr(_ sender: Any) {
    let alert = UIAlertController(title: "値を入力してください", message: "\n\n\n\n\n\n\n\n", preferredStyle: .alert)

    // ViewControllerの参照をセット
    alert.delegate = self
     ・
     ・
     ・

func appendData(str:String) {
    // CustomAlertで作成した文字列をデータに追加
   // tableViewをリロード
}

CustomAlert.swift

class CustomAlert: UIView ,UIPickerViewDataSource,UIPickerViewDelegate {

    var delgate:ViewController?
     ・
     ・
     ・

  @IBAction func ok(_ sender: Any) {
    let str = 横一列文字
    delegate?.appendData(str) // ViewControllerのメソッドを実行
  }

何をやってるのかを理解したあとにデリゲートパタンにリファクタリングするのが良いと思います。

 追記:サンプルコード

ViewController.swift

import UIKit

/*
 PickerViewは乗ってないからUIPickerViewDelegate,UIPickerViewDataSourceはいらない
 */
class ViewController: UIViewController /*,UIPickerViewDelegate,UIPickerViewDataSource*/ {

    var data:[String]  = []

    @IBOutlet weak var mytableView: UITableView!

//    var pickerView = UIPickerView()
//    let number = ["回","lep"]
//    let datalist2 = ["kg","lbs"]

    @IBAction func customalertbtr(_ sender: Any) {
        let customAlert = CustomAlert(frame: CGRect(x: 0.0, y: 0.0, width: 350 , height: 275))
        customAlert.center = self.view.center
        customAlert.backgroundColor = .orange

        // ViewControllerの参照をセット
        customAlert.delegate = self

        //print(customAlert) //これ追加
        self.view.addSubview(customAlert)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        mytableView.dataSource = self
        mytableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

// データ・ソース
extension ViewController: UITableViewDataSource {

    // データ数
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return data.count
    }

    // セクション数
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    // セルの高さ
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 40
    }

    // セル生成
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        cell.textLabel?.text = data[indexPath.row]

        return cell
    }
}

extension ViewController: CustomAlertDelegate {
    func appendData(str:String) {
        // CustomAlertで作成した文字列をデータに追加
        data.append(str)
        // tableViewをリロード
        mytableView.reloadData()
    }
}

CustomAlert.swift

import UIKit

// プロトコル
protocol CustomAlertDelegate {
    func appendData(str:String)
}

class CustomAlert: UIView ,UIPickerViewDataSource,UIPickerViewDelegate {

    //lepsに関して
    let item = ["-5","-4","-3","-2","-1","0","1","2","3","4","5",]
    var lepsSelectedIndex = 0

    let kgLbsArr = ["円","ドル"]
    var kgLbsSelectedIndex = 0

    let difficulityArr = ["安い","普通","高い"]
    var difficulitySelectedIndex = 0

    var delegate:CustomAlertDelegate? // 他クラス(今回はViewController)の参照を格納するための変数

    @IBOutlet var myview: UIView!
    @IBOutlet weak var titlelbl: UILabel!
    @IBOutlet weak var exlbl: UILabel!
    @IBOutlet weak var lepstxt: UITextField!
    @IBOutlet weak var kgtxt: UITextField!
    @IBOutlet weak var lepslbl: UILabel!
    @IBOutlet weak var lepspicker: UIPickerView!

    @IBAction func kglbs(_ sender: Any)
    {
        switch (sender as AnyObject).selectedSegmentIndex {
        case 0:
            //mytableView.text = "kg"
            print("kg")
        case 1:
            //mytableView.text = "lbs"
            print("lbs")
        default: break
        }

        kgLbsSelectedIndex = (sender as! UISegmentedControl).selectedSegmentIndex
    }

    @IBAction func difficulty(_ sender: Any)
    {
        switch (sender as AnyObject).selectedSegmentIndex {
        case 0:
            kgtxt.textColor = UIColor.blue
        case 1:
            kgtxt.textColor = UIColor.red
        case 2: //3:
            kgtxt.textColor = UIColor.darkGray
        default: break
        }

        difficulitySelectedIndex = (sender as! UISegmentedControl).selectedSegmentIndex
    }

    //コードから
    override init(frame: CGRect) {
        super.init(frame: frame)
        self.commonInit()
    }

    //ストボーから
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.commonInit()
    }

    fileprivate func commonInit() {

        guard let view = UINib(nibName: "CustomAlert", bundle: nil).instantiate(withOwner: self, options: nil).first as? UIView else {
            return
        }

        //textfieldに関して
        lepstxt.placeholder = "個数を入力してください。"
        kgtxt.placeholder = "値段を入力してください。"
        lepstxt.font = UIFont(name: "Hiragino Sans", size: 11)
        kgtxt.font = UIFont(name: "Hiragino Sans", size: 11)

        //デリゲート設定
        lepspicker.delegate = self
        lepspicker.dataSource = self
        //lepspicker.selectedRow(inComponent: 6)
        //lepspicker.backgroundColor = .gray

        view.frame = self.bounds

        self.addSubview(view)

    }

    @IBAction func cancel(_ sender: Any) {
        self.removeFromSuperview()
    }
    @IBAction func ok(_ sender: Any) {

        let lepsVal = lepstxt.text
        let kgtVal = kgtxt.text
        let lepsLbl = lepslbl.text
        let num = item[lepsSelectedIndex]
        //mytbleView.text = String(item,array)

        let cellString = lepsVal! + "が" + num + "(" + lepsLbl! + ")" + " " + kgtVal! + "[" + kgLbsArr[kgLbsSelectedIndex] + "]" + " " + difficulityArr[difficulitySelectedIndex]
        // ViewControllerのメソッドを実行
        delegate?.appendData(str: cellString)
        // アラート閉じる
        self.removeFromSuperview()
    }

    // PickerViewの列数
    func numberOfComponents(in pickerView: UIPickerView) -> Int {
        return 1
    }

    // PickerViewの行数
    func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
        return item.count
    }

    // PickerViewの項目
    func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
        return item[row]
    }

    // PickerViewの項目選択時
    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        lepsSelectedIndex = row
    }

}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/02/19 18:23

    追記すればいいのでしょう

    キャンセル

  • 2018/02/19 18:29

    alert内のtextFieldの色は@IBAction func difficulty(_ sender: Any)で変えれるのですが、どうしてもtableViewに反映される時にデフォルトの黒に戻っています。もちろん、tableViewに反映させる時に色を変更させるコードがないので仕方がないのですがどの部分をswitch文でかけばいいのでしょうか?

    キャンセル

  • 2018/02/19 19:01

    回答追加したのでソース見ながら把握してください

    キャンセル

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

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

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