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

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

ただいまの
回答率

90.85%

  • Swift

    6480questions

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

  • Xcode

    3746questions

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

  • iOS

    3680questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

二つの変数を結びつける方法

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 189

haruka-t

score 70

import UIKit

class topViewController: ViewController {

  @IBOutlet var titlelbl: UILabel?

  // ClassMethodクラスを定義
  class ClassMethod {
  }
  // メタタイプを取得
  let type = ClassMethod.self
  // 型名の文字列を生成
  let typeString = String(describing: ClassMethod())


  @IBAction func StartButton(_ sender: Any) {
    let alert = UIAlertController(title: "タイトル", message: "メッセージ", preferredStyle: .alert)

    let okAction = UIAlertAction(title: "OK", style: .default, handler: {
      (action:UIAlertAction!) -> Void in

      if let textFields = alert.textFields {

        for textField in textFields {
          if let text = textField.text {
          print(textField.text!)
          //self.cellData.append(CellData(text))

          self.navigationItem.title = text
          //遅延に関するコード
          DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
            // your code here
            self.performSegue(withIdentifier: "ViewControllersegue", sender: nil)
          }
          }
        }
      }
    })
    alert.addAction(okAction)

    let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
    alert.addAction(cancelAction)

    alert.addTextField(configurationHandler: {(textField: UITextField!) -> Void in
      textField.placeholder = "テキスト"
    })
    alert.view.setNeedsLayout() // シミュレータの種類によっては、これがないと警告が発生
    // アラートを画面に表示
    self.present(alert, animated: true, completion: nil)

  }

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "ViewControllersegue" {
      let nextView: ViewController = segue.destination as! ViewController

      nextView.titleName = typeString
    }
  }

 やりたい事

ClassMethodlet typeStringif let textFields = alert.textFields {
に結びつけたい

何故やるのか
アラートで入力したものを遷移先のviewcontrollerのtitleで表示させるため

////
出来ている事
ちゃんと遷移先で意図した表示をされるのかを確かめる為var itme = "name"にして実行し、遷移先のtitleが変わっているまでは確認できた。
その為、変数をlet textFieldsに結びつける事が出来れば意図した意図した事ができると思われる。

 追記 navigationItemのボタンの名前について

遷移先でボタンの名前も変わっていましたので以下のようにしたところ、ボタンの固定できるようになりました。
let backButtonItem = UIBarButtonItem(title: "back", style: .plain, target: nil, action: nil)
navigationItem.backBarButtonItem = backButtonItem

イメージ説明

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+2

performSegueの引数(sender)に渡してあげるのが簡単ですね。

// セグエにtextを渡す
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
    self.performSegue(withIdentifier: "ViewControllersegue", sender: text)
}
// senderに来たtextをStringにキャストして渡す
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "ViewControllersegue",
        let nextView: ViewController = segue.destination as? ViewController,
        let text = sender as? String {

        nextView.titleName = text
    }
}

回答追記

遷移前画面のNavigation ItemBack Buttonを設定してください。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/05/28 01:11

    ありがとうございます。解決しました。
    しかし、現状のコードですと,遷移先のtitleの他に戻る時のボタン、他の画面のtitleにも対しても、アラートの入力した中身が反映されているのですが遷移先viewのtitleだけ入力したものを反映させたい時はどのようにすればいいのでしょうか?

    キャンセル

  • 2018/05/28 01:23

    回答に追記しました。
    聞いたらすぐに分かりますが、自分でも調べて分からなければ聞く癖を付けたほうが良いと思いますよ。

    キャンセル

  • 2018/05/28 01:59 編集

    分かりました。これからは調べてから質問するようにします。
    質問に追記しましたがボタンについてbackBarButtonItemの処理をコーディングしたことにより改善出来ました。
    そして、今、navigationItemのtitleの名前をviewcontrollerだけ表示されるようにしようとしているので、qita等でそれに関する記事を探してみましたが見当たりませんでした。その為、何かアドバイスを頂けないでしょうか?
    浅はかな考えですがself.ViewController.title = self.titleNameにしてみましたが案の定has no memberエラーで出来ませんでした。

    キャンセル

  • 2018/05/28 02:13

    やりたいことが見えてませんが、ViewControllerを継承した画面でも同じメソッドでタイトルを取得したいという感じですか?

    キャンセル

  • 2018/05/28 02:25

    説明不足ですいませんでした。説明しやすくするためにスクショを追記しました。
    今回行いたい事としてはアプリを立ち上げた時のスタート画面であるDiary Note Bookのstartボタンをタップした時にviewcontrollerに遷移していきます。その際に遷移先のviewのtitleを指定したいと思い遷移する前にアラートを呼び出して入力出来るように実装しました。
    そして遷移した時に遷移先のviewだけtitleをつけたいと考え、今回の質問に至りました。
    しかしながら、現状のコードですと遷移先のviewだけでなく、スタート画面のviewまでtitleがついてしまっているのでそれを無くしたく@_Kentarouさんに質問しました。

    キャンセル

  • 2018/05/28 02:28

    👇で自分のタイトルを設定してますが、、、

    self.navigationItem.title = text

    キャンセル

  • 2018/05/28 02:38

    self.navigationItem.title = text
    上記のコードは遷移先のviewだけに適用するつもりでコードを書きましたがこれによってDiary Note Bookのviewまでtitle名が変わってしまうんですね。その場合、if文(どう条件分岐すればいいか分からないが)で条件分岐をし、遷移先のviewだけ反映させるようなコードにすれば私が意図した操作に出来ますか?

    キャンセル

  • 2018/05/28 02:41 編集

    遷移先のタイトルは回答のコードで渡せていると思うので、self.navigationItem.title = text は消せばよいのでは?

    キャンセル

  • 2018/05/28 02:50

    解決できました。てっきり、遷移先に渡すために必要なコードだと考えていましたので、何も疑問を感じず残していました。
    夜遅い中、何度も聞き返してしまい誠に申し訳ありませんでした。以後、よく調べ、コードを見返すように気をつけます。
    ご迷惑お掛けして本当にすいませんでした。

    キャンセル

  • 2018/05/28 02:53

    結構寝て起きたらサクッと分かるパターンもあるので、寝るのもひとつの手です。
    お疲れ様です。

    キャンセル

  • 2018/06/02 01:56

    @_Kentarouさん
    以前修正して頂いたリポジトリに今、データ保存機能を導入したくRealmを利用してデータ保存をしようと考え、Qiitaやrealmの公式ドキュメントを参考にして試してみたのですがその際にCellDataクラスの部分でObjectのクラスにvar list = List<CellData>()こうして見たのですがエラーが出ていましました。いろいろ調べてみるとstring型の場合ですとObjectクラスには入れれないと言うことがわかったのですがそうすともうどのようにコーディングしていけば良いか分からなく困っています。
    お忙しいと思いますが、もし時間がありましたらまたリポジトリにあげましたので見て頂けないでしょうか?
    やりたい事としては、日記アプリみたいなものをイメージしているのでホーム画面のアラーたで入力したものは遷移すると同時にデータベースとなるviewのセルに自動的にタイトルが反映されるようにし、なおかつ、HistoryViewControllerのtableViewにもボタンをタップした時の日付とその際に入力したものをtabelViewに反映させ、その後振り返りたいときにデータベースのtebleviewからアクセスして入力したものを振り返れる事もイメージしています。
    https://github.com/haruka22/project
    今回は私なりに一所懸命調べた上でどうしてもエラー箇所を解決出来ませんでしたのでお伺いしました。
    そのため、何かアドバイスやご指導をして頂けると幸いです。よろしくお願いします。

    キャンセル

  • 2018/06/02 09:23

    見ましたが、プロジェクトファイルもなくてXcodeで開くことすらできません。

    キャンセル

  • 2018/06/04 06:21

    返信遅くなりすいません。申し訳ありませんでした。私の手違いでした。
    https://github.com/haruka22/22
    こちらに再度アップしました。
    realmを利用した事によりPodsファイルがファイルが多すぎてアップ出来ないと警告が表示されPodsファイルはアップすることが出来ませんした。
    見ていただけると幸いです。
    私なりにrealmを使い、まずはデータを保存させようと試みましたがコードにはエラーがなく実行すると落ちてしまいます。
    原因を色々ここ数日間探って見ました分かりませんでした。

    キャンセル

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

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

関連した質問

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

  • Swift

    6480questions

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

  • Xcode

    3746questions

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

  • iOS

    3680questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。