前提・実現したいこと
Swift初心者です。勉強のために、二次元図形(円)を描画し、設置したtextfieldに中心座標を入力してreturnを押すと、その座標を中心として円が再描画されるという簡単なアプリを作っています。
アプリ起動時に円を描画することはできましたが、textfieldに座標を入力してもそれが反映されず、円がアプリ起動時に描画された座標のまま変化しません。
おそらく再描画する処理ができていないせいだと思いますが、どのタイミング・場所で再描画を行えば良いかが分かりません。
どなたか教えていただけるとありがたいです。
発生している問題・エラーメッセージ
設定したtextfieldに新規座標を入力しても、それがviewに反映されない
該当のソースコード
lang
//ViewController.swift import UIKit class ViewController: UIViewController, UITextFieldDelegate { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. // テキスト毎にタグを設定 xText.delegate = self xText.tag = 1 yText.delegate = self yText.tag = 2 self.view.backgroundColor = UIColor.gray // 全体背景をグレーに設定 } @IBOutlet weak var xLabel: UILabel! @IBOutlet weak var ylabel: UILabel! @IBOutlet weak var xText: UITextField! @IBOutlet weak var yText: UITextField! func textFieldShouldReturn(_ textField: UITextField) -> Bool { // キーボードを閉じる textField.resignFirstResponder() let nextView = TestDraw() // インスタンスを生成 // switch文により、xtextに入力した場合とytextに入力した場合を分ける switch textField.tag { case 1: // xTextに入力した値をStringからCGFloatに変換 let xDouble: Double = atof(textField.text) let x: CGFloat = CGFloat(xDouble) // 入力された値をTestDraw.swift内に存在する座標変数へと格納 nextView.x = x break case 2: // 同様のことをyTextについてもやる let yDouble: Double = atof(textField.text) let y:CGFloat = CGFloat(yDouble) nextView.y = y break default: print("エラー") break } return true } }
lang
//TestDraw.swift import UIKit class TestDraw: UIView { /* // Only override draw() if you perform custom drawing. // An empty implementation adversely affects performance during animation. */ // ViewControllerのxtextからの値を格納する変数 var x:CGFloat = 150 // 初期値 // 同じくyTextからの値を格納する変数 var y:CGFloat = 100 // 初期値 override func draw(_ rect: CGRect) { // Drawing code // 円の描画 let circle = UIBezierPath(arcCenter: CGPoint(x: x, y: y), radius: 80, startAngle: CGFloat(Double.pi*2.0*0.0/360.0), endAngle: CGFloat(Double.pi*2.0*360.0/360.0), clockwise: true) let circleColor = UIColor.red circleColor.setStroke() // 線の色を設定 circleColor.setFill() // 内側塗りつぶし色の設定 circle.fill() // 内側塗りつぶし circle.lineWidth = 4 circle.stroke() } }
試したこと
このプログラムでSimulatorを起動してみた画像が以下になります。
円の中心座標XとYの初期値は、それぞれ150と100に設定していますので、異なる値を入力してみます。
この状態でキーボードのreturnキーを押しても、変更が円に反映されませんでした。
ViewController.swiftを以下のようにし、returnキー押下時にTestDraw.swiftのxとyが正しく変化しているのか確認してみました。
lang
//ViewController.swift import UIKit class ViewController: UIViewController, UITextFieldDelegate { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. // テキスト毎にタグを設定 xText.delegate = self xText.tag = 1 yText.delegate = self yText.tag = 2 self.view.backgroundColor = UIColor.gray // 全体背景をグレーに設定 } @IBOutlet weak var xLabel: UILabel! @IBOutlet weak var ylabel: UILabel! @IBOutlet weak var xText: UITextField! @IBOutlet weak var yText: UITextField! func textFieldShouldReturn(_ textField: UITextField) -> Bool { // キーボードを閉じる textField.resignFirstResponder() let nextView = TestDraw() // インスタンスを生成 // switch文により、xtextに入力した場合とytextに入力した場合を分ける switch textField.tag { case 1: // xTextに入力した値をStringからCGFloatに変換 let xDouble: Double = atof(textField.text) let x: CGFloat = CGFloat(xDouble) // 入力された値をTestDraw.swift内に存在する座標変数へと格納 nextView.x = x print("x = (nextView.x)") // 追加箇所 break case 2: // 同様のことをyTextについてもやる let yDouble: Double = atof(textField.text) let y:CGFloat = CGFloat(yDouble) nextView.y = y print("y = (nextView.y)") // 追加箇所 break default: print("エラー") break } return true } }
それぞれのtextfield内に、以下のように値を入力してみます。
returnキーを押した後の出力は以下のようになりました。
x = 200.0
y = 150.0
これを見る限り、値はきちんと代入されているのだと思います、、。
補足情報(FW/ツールのバージョンなど)
Swift4.2
Xcode10
まだ回答がついていません
会員登録して回答してみよう