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

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

ただいまの
回答率

90.76%

  • Swift

    6717questions

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

  • Xcode

    3857questions

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

Swift 別のクラスから座標を受け取って線を描画することができません

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 172

tet1717

score 1

 前提・実現したいこと

Xcodeの環境でswiftで線を描画しようとしています。
描画を行うクラスと、メインの処理を行うUIViewControllerを継承したクラスに分かれているのですが、メインの処理で取得したデータを座標として描画クラスに与えた時に直線が描画されません。

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

エラーメッセージ
2018-0503 10:02:34.129144+0900 horse[4578:3641255] [Unknown process name] CGContextSetStrokeColorWithColor: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
2018-0503 10:02:34.130535+0900 horse[4578:3641255] [Unknown process name] CGContextSaveGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
2018-0503 10:02:34.130647+0900 horse[4578:3641255] [Unknown process name] CGContextSetLineWidth: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
2018-0503 10:02:34.130687+0900 horse[4578:3641255] [Unknown process name] CGContextSetLineJoin: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
2018-0503 10:02:34.130713+0900 horse[4578:3641255] [Unknown process name] CGContextSetLineCap: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
2018-0503 10:02:34.130738+0900 horse[4578:3641255] [Unknown process name] CGContextSetMiterLimit: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
2018-0503 10:02:34.130764+0900 horse[4578:3641255] [Unknown process name] CGContextSetFlatness: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
2018-0503 10:02:34.130803+0900 horse[4578:3641255] [Unknown process name] CGContextAddPath: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
2018-0503 10:02:34.130829+0900 horse[4578:3641255] [Unknown process name] CGContextDrawPathContextSetLineJoin: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.
2018-0503 10:02:34.130854+0900 horse[4578:3641255] [Unknown process name] CGContextRestoreGState: invalid context 0x0. If you want to see the backtrace, please set CG_CONTEXT_SHOW_BACKTRACE environmental variable.

 該当のソースコード

ソースコード
import UIKit

class ViewController: UIViewController {
    let myView : MyView = MyView(frame:CGRect(x:0,y:0,width:300,height:500))

    override func viewDidLoad() {
        super.viewDidLoad()
        myView.isOpaque = false
        myView.backgroundColor = UIColor.cler
        view.addSubview(myView)
    }

    @IBAction func PushButton(_ sender:Any) {
        var x,y,xx,yy:Int
        x=100
        y=100
        xx=200
        yy=200
        // この描画が実行されずwarningが表示される
        myView.draw_line(x1:x,y1:y,x2:xx,y2:yy)
    }
}
class MyView:UIView {
    // ここにx,y,xx,yyを引数として渡す方法があれば解決するのですが・・・
    override func draw(_ rect: CGRect) {
        // この中に記述すれば問題なく描画される
        draw_line(x1:300,y1:300,x2:400,y2:400)
    }
    // できないのでこちらの関数で描画したい
    func draw_line(x1:Int,y1:Int,x2:Int,y2:Int) {
        let path = UIBezierPath()
        path.move(to:CGPoint(x:x1,y:y1))
        path.addLine(to:CGPoint(x:x2,y:y2))
        path.lineWidth = 2.0
        UIColor.brown.setStroke()
        path.stroke()
    }
}

 試したこと

描画クラスMyViewを宣言する場所を変える、overrideのdraw関数の引数としてx1,y1,x2,x2を渡す等してみましたが、overrideされた形から変わってしまうためうまくいきませんでした。

 補足情報(FW/ツールのバージョンなど)

仕様ツールはXcode version 9.3(9E145)です。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

一旦MyViewの変数に覚えさせましょう

class ViewController: UIViewController {
    @IBAction func PushButton(_ _: Any) {
        myview.setRect(x1: 10, y1: 10, x2: 100, y2: 70)
    }
}

class MyView : UIView
{
    var x1, y1, x2, y2:Int

    func setRect(x1:Int, y1:Int, x2:Int, y2:Int)
    {
        self.x1 = x1
        self.y1 = y1
        self.x2 = x2
        self.y2 = y2
        setNeedsDisplay()
    }
}


それか表示されない画像に描いてしまってdrawでそれを描画するか

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/03 21:53

    ご回答ありがとうございます!
    お教えいただいた記述を使ったらきちんと描画されました!動くと嬉しいですねこれ!
    初期化されたクラス変数を使った描画の記述をdraw関数内でしておき、新たにsetRect関数を作成して、そこでクラス変数の値を更新して再描画する、という手順にすることで正常に描画されるのですね。覚えておきたいと思います!

    キャンセル

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

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

関連した質問

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

  • Swift

    6717questions

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

  • Xcode

    3857questions

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