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

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

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

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

解決済

Swift コードでlabelを記述、レイアウト用の別のクラスから参照したい

ataru2222
ataru2222

総合スコア209

Swift

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

1回答

0評価

0クリップ

123閲覧

投稿2022/05/15 01:52

編集2022/05/23 18:24

実現したいこと

現在コードでlabelを記述するようにしているのですが、別のクラス(Layout.swift)から参照したい。

ViewControllr内にfunctionとして書き出すことはできたのですが、パーツが多くなってくるとどうしても縦長になってしまうのでレイアウトに関する記述は、可能ならばレイアウト用のファイルに書きたいと考えております。

発生している問題・エラーメッセージ

Instance member 'label' cannot be used on type 'ViewController'; did you mean to use a value of this type instead?

訳:
インスタンスメンバー「label」はタイプ「ViewController」では使用できません。 代わりにこのタイプの値を使用するつもりでしたか?

該当のソースコード

swift

import UIKit class ViewController: UIViewController { let label = UILabel() let button1 = UIButton() override func viewDidLoad() { super.viewDidLoad() Layout.testLabel() } }

swift

import Foundation class Layout { //ラベルを配置 class func testLabel() { ViewController.label.text = "Label" ViewController.label.frame = CGRect(x: 0, y: 0, width: 100, height: 100) ViewController.view.addSubview(ViewController.label) } }

試したこと

ViewController内にfunctionとして書き出すことはできたが、別クラス(Layout.swift)では上手くいかず。

このようなことは可能でしょうか?
詳しい方いらっしゃいましたら、ご教授願います。
よろしくお願いいたします。

追記2022.05.16 20:16

swift

import Foundation class Layout { //ラベルを配置 func testLabel() { let test = ViewController() test.label.text = "Label" test.label.frame = CGRect(x: 100 //←ここでスコープエラー , y: 100 , width: 100 , height: 100) test.view.addSubview(test.label) } }

少し進んだのですがCGRectにアクセスできない状態です。
let testView = UIView()
var testView = UIView()
let label → var label

等を思いついたのですが、CGRectはどうすれば通して、配置で切るのでしょうか?
ご存知の方いらっしゃいましたら、ご教授願います。

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

hoshi-takanori

2022/05/16 01:54

クラスとインスタンスの区別がついてないようですね。 label はインスタンスごとに存在する変数なので、label にアクセスするには ViewController のインスタンスが必要です。
ataru2222

2022/05/16 11:25

hoshi-takanori様 回答していただき、ありがとうございます。 確かにインスタンス化してみたら一部のエラーは消えたのですが、CGRectの行だけ修正できませんでした。 業務で書くとき、このような事をすることはありますか? ご存知でしたら、教えていただければ幸いです。
hoshi-takanori

2022/05/16 15:35

追記見ました。「インスタンスが必要」と言われたら、やっぱりそうなりますよね…。残念ながら、testLabel メソッドで let test = ViewController() とすると、元の ViewController インスタンスとは別に、新しいインスタンスを作ってるので、label も view も別物になってしまいます。新しくインスタンスを作るのではなく、今あるインスタンス (self) を、引数で渡すのが良いかと…。
ataru2222

2022/05/18 15:17

hoshi-takanori様 >今あるインスタンス (self) を、引数で渡すのが良いかと…。 こちらについて調べてみたのですが、 let test = ViewControllerA(popType: ViewController) のような記述はあったのですが、動かずよく分かりませんでした。 今回のような場合、どのインスタンスを使って引数で渡したら良いのでしょうか?

まだ回答がついていません

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Swift

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