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

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

ただいまの
回答率

90.37%

  • Swift

    9168questions

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

  • Xcode

    5162questions

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

【Swift2.0】送られてきたテキストの文字をTextViewに表示させたい

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,063

3buro

score 23

いつもお世話になっております。

【実装したい機能】
・MessageEditViewControllerで入力した文章を
 ProccesingViewController(遷移先)にTextViewとして表示する
 (入力した文章量に合わせてTextViewのサイズを変更する)
・ProccesingViewControllerに書き出したTextViewを再編集する
 (再編集する場合はMessageEditViewControllerに戻る)

【現状】
・MessageEditViewControllerで入力した文章を
 ProccesingViewController(遷移先)にTextViewとして表示できたが、
 TextViewのサイズが文章に合っておらず、すべて表示されない
・TextViewにフォーカスが移った場合、MessageEditViewControllerに
 遷移する記述を書いているが、テキストの取得と表示の仕方、
 TextViewへの上書きの仕方がわからない
・MessageEditViewControllerに遷移したあと、その画面を閉じようとすると
 再度キーボードが立ち上がる

【教えていただきたいこと】
・文章量にあったTextViewの書き出し方
・TextViewを再編集させるコードのスマートな記述方法
 (TextViewへのフォーカスでなく、ダブルタップで画面遷移を指定させる方法など)
・TextViewのTextの渡し方、TextViewの上書き方法など

---1/12追記---
Messageクラスについて追記しました。
書き出したビューをタッチイベントで動かしています。
書き出したビューの削除はdeleteボタンを作成し、そこで削除しています。
2つ目の質問に関してもう少し具体的に説明いただけたら、と思います。

---1/14追記---
回答をもとに記述を追加しました。
画面遷移の方法について助言、添削、別の記述方法などあればぜひとも教えてください。

コードの添削、助言、参考サイトなどを教えていただけるとありがたいです。
恐れ入りますが、なにとぞよろしくお願いします。

<<MessageEditViewController>>

import UIKit

class MessageEditViewController: UIViewController, UITextViewDelegate {

    @IBOutlet var txtView: UITextView!
    var senderTxt: String!

    var appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate

    override func viewDidLoad() {
        super.viewDidLoad()

        txtView.delegate = self

        txtView.keyboardType = .Default
        txtView.becomeFirstResponder()

    }


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


    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        txtView.text = senderTxt
    }

    @IBAction func decideTapped() {
        let message = Message()
        //textview.textを何かにいれて渡す?
        message.text = txtView.text
        let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        appDelegate.letterMessageArray.append(message)
        appDelegate.isNewLetterMessageAdded = true
        self.dismissViewControllerAnimated(true, completion: nil)
    }


    @IBAction func closeTapped() {
        //ifでアラートを表示(編集を完了していませんがよろしいですか?)
        self.view.endEditing(true)
        self.dismissViewControllerAnimated(true, completion: nil);
    }
}

<<ProccesingViewController>>---1/14追記---

import UIKit

class LetterProcessingViewController: UIViewController, UIAlertViewDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UIGestureRecognizerDelegate, UITextViewDelegate {

    @IBOutlet var letterSetView: UIView!
    @IBOutlet var letterImageView: UIImageView!
    @IBOutlet var stampImageView: UIImageView!
    @IBOutlet var PhotoSelectView:UIImageView!
    @IBOutlet var PhotoSelectButton:UIButton!

    var imageArray:[UIImage] = []

    var appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate

    var messageString: String!
    var messageCount = 1

    override func viewDidLoad() {
        super.viewDidLoad()

        letterImageView.userInteractionEnabled = false

        Photo()

        // Do any additional setup after loading the view.
    }

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


    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        if appDelegate.isNewLetterMessageAdded == true {
            let message = appDelegate.letterMessageArray.last!
            let fixedWidth = message.frame.size.width
            message.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.max))
            let newSize = message.sizeThatFits(CGSizeMake(fixedWidth, CGFloat.max))
            var newFrame = message.frame
            newFrame.size = CGSizeMake(max(newSize.width, fixedWidth), newSize.height)
            message.frame = newFrame
            message.textContainerInset = UIEdgeInsetsMake(5, 5, 5, 5)
            message.sizeToFit()
            message.scrollEnabled = false
            //message.frame = CGRectMake(0, 0, 150, 0)
            //message.backgroundColor = UIColor.clearColor()
            message.font = UIFont.systemFontOfSize(14.0)
            message.center = stampImageView.center
            message.userInteractionEnabled = true
            message.editable = true
            message.delegate = self
            letterSetView.addSubview(message)
            messageCount = messageCount + 1
            appDelegate.isNewLetterMessageAdded = false
        }
    }

    func messageEditButton() {
        print("messageEditButton")
        //print(myMessages)

        let MES = MessageEditViewController()
        MES.senderTxt = myMessages
        MES.modalTransitionStyle = UIModalTransitionStyle.CoverVertical
        self.presentViewController(MES, animated: true, completion: nil)

    }


    //テキストビューにフォーカスが移った場合
    func textViewShouldBeginEditing(textView: UITextView) -> Bool {
        print("テキストビュー触ってる")
        let text = appDelegate.letterMessageArray.last!
        // テキストをストリング型に入れる
        let ms = storyboard?.instantiateViewControllerWithIdentifier("MessageEdit") as! MessageEditViewController
        ms.modalTransitionStyle = UIModalTransitionStyle.CoverVertical

        ms.txtView = text
        self.view.endEditing(true)
        self.presentViewController(ms, animated: true, completion: nil)
        return true
    }

    //テキストビューからフォーカスが失われた場合
    func textViewShouldEndEditing(textView: UITextView) -> Bool {
        print("テキストビューから離れた")
        return true
    }

    @IBAction func messageTapped() {
        let ms = storyboard?.instantiateViewControllerWithIdentifier("MessageEdit") as! MessageEditViewController
        ms.modalTransitionStyle = UIModalTransitionStyle.CoverVertical
        self.presentViewController(ms, animated: true, completion: nil)
    }

}


<<Message>>---1/14追記---

import UIKit

class Message: UITextView, UIGestureRecognizerDelegate {

    var currentTransform: CGAffineTransform!
    var scale: CGFloat = 1.0
    var angle: CGFloat = 0
    var isMoving: Bool = false

    override func didMoveToSuperview() {
        let rotationRecognizer: UIRotationGestureRecognizer = UIRotationGestureRecognizer(target: self, action: "rotationGesture:")
        rotationRecognizer.delegate = self
        self.addGestureRecognizer(rotationRecognizer)

        let pinchRecognizer: UIPinchGestureRecognizer = UIPinchGestureRecognizer(target: self, action: "pinchGesture:")
        pinchRecognizer.delegate = self
        self.addGestureRecognizer(pinchRecognizer)

        let tapRecognizer: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "tapGesture:")
        tapRecognizer.numberOfTapsRequired = 1
        tapRecognizer.delegate = self
        self.addGestureRecognizer(tapRecognizer)
    }

    func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }
    func tapGesture(gesture: UITapGestureRecognizer) {
        print("tapGesture")
        myMessage = self.titleLabel?.text
        print(myMessage)
        //メソッドの呼び出し
        let LP = LetterProcessingViewController()
        LP.myMessages = myMessage
        LP.messageEditButton()
    }

    func rotationGesture(gesture: UIRotationGestureRecognizer) {
        if !isMoving && gesture.state == UIGestureRecognizerState.Began {
            isMoving = true
            currentTransform = self.transform
        } else if isMoving && gesture.state == UIGestureRecognizerState.Ended {
            isMoving = false
            scale = 1.0
            angle = 0.0
        }

        angle = gesture.rotation

        let transform = CGAffineTransformConcat(CGAffineTransformConcat(currentTransform, CGAffineTransformMakeRotation(angle)), CGAffineTransformMakeScale(scale, scale))

        self.transform = transform
    }

    func pinchGesture(gesture: UIPinchGestureRecognizer) {
        if !isMoving && gesture.state == UIGestureRecognizerState.Began {
            isMoving = true
            currentTransform = self.transform
        } else if isMoving && gesture.state == UIGestureRecognizerState.Ended {
            isMoving = false
            scale = 1.0
            angle = 0.0
        }

        scale = gesture.scale

        let transform = CGAffineTransformConcat(CGAffineTransformConcat(currentTransform, CGAffineTransformMakeRotation(angle)), CGAffineTransformMakeScale(scale, scale))

        self.transform = transform;
    }

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        self.superview?.bringSubviewToFront(self)
    }

    override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
        let touch = touches.first!

        let dx = touch.locationInView(self.superview).x - touch.previousLocationInView(self.superview).x
        let dy = touch.locationInView(self.superview).y - touch.previousLocationInView(self.superview).y

        self.center = CGPointMake(self.center.x + dx, self.center.y + dy)
    }

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • Stripe

    2016/01/12 22:51

    あなたは、LetterProcessingViewControllerクラスのtextViewShouldBeginEditing()関数内に、「ms.txtView = text」と書いています。
    MessageEditViewControllerクラスのtxtView変数の内容を上書きしていますよね?

    キャンセル

  • Stripe

    2016/01/13 00:58

    ところで、TextViewの編集を別のViewControllerでやる理由は何ですか?TextViewのタップで画面遷移させなくても、そのままTextViewで編集できると思いますが?

    キャンセル

  • 3buro

    2016/01/13 09:31

    何もないところからメッセージテキストを表示させるボタンを使用して、テキストビューを吐き出してます。そこでメッセージを作成しているので、編集もそちらで…と思ったことが、TextViewの編集を別のViewControllerでやる理由です。

    キャンセル

回答 1

0

まず、LetterProcessingViewControllerのTextViewを編集不可にしてください。
そして、TextViewの編集開始ではなく、タップで編集画面へ遷移してください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/01/14 10:54

    回答ありがとうございます。
    TextViewを動かしているMessage.swiftにタップジェスチャーでのイベントを追加し、そこで画面遷移させる記述を行いました。
    画面遷移させる記述のところでエラーが出てしまい、そこから二進も三進もいかない状況です。self.presentViewController(MES, animated: true, completion: nil)の記述を用いているのですが、これが間違いなのでしょうか?

    キャンセル

  • 2016/01/15 17:10

    もともと、画面遷移はできていたはずでは?

    キャンセル

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

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

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

  • Swift

    9168questions

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

  • Xcode

    5162questions

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