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

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

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

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

Q&A

2回答

1053閲覧

Swift letの値をテキストフィールドの値に変更する

ataru2222

総合スコア272

Swift

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

0グッド

0クリップ

投稿2019/08/19 07:22

編集2022/01/12 10:55

Swiftを参考書を見ながら勉強しているのですが、
基本的にグラフ描写などの記述では
コードの中に数字を入れてあるものばかりです。
この例で行くと

let n = 40
のような値です。

このような場合に
storyBoard上に設置したtext11とbutton1を使って
→ let n = 40 の40をtext1に入力された値にする
→ button1を押した時に描画

ということを実現したいのです。

しかし、
class ZLineの中に
textをoutlet接続することもできなければ
Buttonを登録することもできません。

しぶしぶ、配置可能な場所に
配置してみても、
let n = text1.text
という記述は読み込めずエラーになります。

swift

1import UIKit 2 3class ZLine: UIView { 4 override func draw(_ r:CGRect) { 5 let l = UIBezierPath() 6 //線の本数を表すNの値をえ変えてみよう 7 8 9 10 11 let n = 40 12 let xmax = Int(r.width) 13 let ymax = Int(r.height) 14 let xn = xmax / n 15 let yn = ymax / n 16 var y = 0 17 for x in stride(from: 0, through: xmax, by: xn) { 18 l.move(to: CGPoint(x: xmax - x, y: ymax)) 19 l.addLine(to: CGPoint(x: x, y: y)) 20 y += yn 21 } 22 y = ymax 23 for x in stride(from: xmax, through: 0, by: -xn) { 24 l.move(to: CGPoint(x: xmax - x, y: 0)) 25 l.addLine(to: CGPoint(x: x, y: y)) 26 y -= yn 27 UIColor.yellow.set() // UIColor.yellow.set 28 // 29 l.stroke() 30 } 31 32 } 33} 34 35public class tenthViewController: UIViewController { 36 37 38 39 40 41 42 override public func viewDidLoad() { 43 44 view.backgroundColor = .cyan 45 view.addSubview(ZLine(frame: CGRect(x: 15, y: 90, width: 300, height: 400))) 46 super.viewDidLoad() 47 48 // Do any additional setup after loading the view. 49 } 50 51 52 /* 53 // MARK: - Navigation 54 55 // In a storyboard-based application, you will often want to do a little preparation before navigation 56 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 57 // Get the new view controller using segue.destination. 58 // Pass the selected object to the new view controller. 59 } 60 */ 61 62} 63

これはおそらく
return を使いながら記述していくのだと感じているのですが

自分の今の力ではイメージもできず、
外部から入力して値を自由に変更できずに困っております故、
どなたか詳しい方、力をお貸しください。

よろしくお願いいたします。

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

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

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

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

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

fuzzball

2019/08/19 08:01

そのタイトルだと「letで定義した変数は変更できません」と回答したくなってしまうので、タイトルを修正して下さい。
hameji

2019/08/19 12:44

わかります、何を言ってるんだって思って開きました(笑)
guest

回答2

0

UIViewのdraw関数は直接外から呼び出すことができませんので、
メンバー変数(正確にはストアドプロパティ)で値を保持してみてください。

swift

1class ZLine: UIView { 2 var hoge: Int = 40 3 4 override func draw(_ r:CGRect) { 5 ... 6 let n = hoge 7 ... 8 } 9}

ZLineのインスタンスもtenthViewControllerのストアドプロパティ(var zLine = ZLine(frame: CGRect(x: 15, y: 90, width: 300, height: 400) など)で保持しておけば、
ボタンが押されたときにzLine.hogeの値を変えてzLine.setNeedsDisplay()を呼び出せば再描画が掛かります。

というか、その辺まで参考書はカバーしているんじゃないでしょうかね。順を追って説明するはずなので、そのうち出てくるんじゃないでしょうか。

投稿2019/08/19 08:03

takabosoft

総合スコア8356

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

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

ataru2222

2019/08/20 00:39

takabosoftさん いつもありがとうございます。 ちなみにtextfieldとbuttonを接続する場所はどこに置いたら良いのでしょうか? class ZLine: UIView { //この中に置いてみたところ・・・} 右クリックで接続するやり方を取っているのですが、 objctの部分がexitとなっておりaction,outlet等の選択もできないいつもと違う挙動になってしまって困惑しています。 時間があるときで構いませんので、よろしくお願いいたします。
takabosoft

2019/08/20 02:26

outletもactionもViewControllerでいいんじゃないでしょうか?
ataru2222

2019/08/20 02:54

・・・ import UIKit class ZLine: UIView { var hoge: Int = 40 override func draw(_ r:CGRect) { let l = UIBezierPath() //線の本数を表すNの値をえ変えてみよう let n = hoge let xmax = Int(r.width) let ymax = Int(r.height) let xn = xmax / n let yn = ymax / n var y = 0 for x in stride(from: 0, through: xmax, by: xn) { l.move(to: CGPoint(x: xmax - x, y: ymax)) l.addLine(to: CGPoint(x: x, y: y)) y += yn } y = ymax for x in stride(from: xmax, through: 0, by: -xn) { l.move(to: CGPoint(x: xmax - x, y: 0)) l.addLine(to: CGPoint(x: x, y: y)) y -= yn UIColor.yellow.set() // UIColor.yellow.set // l.stroke() } } } public class tenthViewController: UIViewController { @IBOutlet weak var text1: UITextField! //★★★★★ @IBAction func button1(_ sender: Any) { } override public func viewDidLoad() { view.backgroundColor = .cyan view.addSubview(ZLine(frame: CGRect(x: 15, y: 90, width: 300, height: 400))) super.viewDidLoad() // Do any additional setup after loading the view. } /* // MARK: - Navigation // In a storyboard-based application, you will often want to do a little preparation before navigation override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // Get the new view controller using segue.destination. // Pass the selected object to the new view controller. } */ } ・・・ すみません。 viewControllerの中にコードを書いてみたのですが、 やはりbutton1の中に入力するコード、★★★★★の部分に入力するコードを どうやって書けばletの中身を変更してグラフを描画できるのか? 自分の今のレベルではわかりませんでした。 お手間をかけさせてしまい申し訳ないのですが、 例となるサンプルコードをいただけないでしょうか? 申し訳ありません。
takabosoft

2019/08/20 06:44

サンプルコードください、は、ここでは推奨されていませんので、言わないほうが良いです。たまに私も出しますが。 とりあえず > ZLineのインスタンスもtenthViewControllerのストアドプロパティで保持 を実践してください。 これをしないと、ボタンタップ時にZlineにアクセスできませんので。
ataru2222

2019/08/20 07:02

ありがとうございます。 『サンプルコードなど、具体的な説明があると質問者の理解の助けになります。』 と公式文に書かれてあるので大丈夫だという認識でしたが、 回答者側から見ると良くは思われないということですね。 自力でもう少し頑張ってみます。 takabosoftさん、いつもありがとうございます。 お時間取らせてしまい申し訳ありませんでした。
takabosoft

2019/08/20 07:36

ですね、回答者が自発的にコードを提示して回答する場合も多々ありますが、質問者さんが直接コードを求めると、このサイトでは丸投げ判定されて毛嫌いされる傾向にあります。低評価が付くこともあります。 私も解決の糸口はすでに出していますので、それを参考にしてください。
ataru2222

2019/08/20 07:42

はい。 ストアドプロパティの意味から調べ直して、やってみます。 ありがとうございました。
guest

0

→ button1を押した時に描画

ボタンを押したときに、グラフを描画する関数を呼び出す、ということを行います。
その際に、

→ let n = 40 の40をtext1に入力された値にする

この値を、その関数の引数に与えてやれば、この値をもとに描画処理を行うというのが可能となります

投稿2019/08/19 07:35

y_waiwai

総合スコア87719

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

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

ataru2222

2019/08/19 07:43

返信ありがとうございます。 誠に申し訳ないのですが、 コードで例をいただけないでしょうか? (お時間があるときで構いません) 初心者本のほとんどがこのような記述で そのイメージができずに困っています。 初心者ですみません。 よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問