2017-05-06 4 views
1

私のアプリケーションでは、ユーザーがオブジェクトを作成するための情報を入力するビューコントローラがあります。このビューの上部にはタブバーがあり、下部にはユーザーがオブジェクトを作成/保存するためのボタンがあります。これらの2つのビューの間には、ユーザーがオブジェクトの情報(基本的にオブジェクトのフォーム)を入力するテキストフィールド、ラベル、その他のいくつかの要素があります。iOSストーリーボードコンテンツを表示するスクロール表示

私は今、風景モードをサポートするだけでなく、このビューコントローラにさらにいくつかのフォームを追加しようとしています。小さなデバイスに問題があり、ランドスケープでフォーム要素やテキストフィールドのすべてが収まりません。

私はこれを解決するためにスクロールビューを使用しようとしています。私はthis Stack Overflow answerを使って、テストプロジェクトでスクロールビューを操作しました(実際のプロジェクトにコンセプトを移植する前に)。私はその方法を使用して、画面の一番下にあるボタンを固定できない場合

だけ問題があります。これを解決するために、メインビューコントローラ(ビューコントローラA)の内部にコンテナビューを作成しました。そのコンテナビューは、スクロールビューと内容を格納するビューコントローラ(ビューコントローラB)にマップされます。ビューコントローラAのコンテナビューのすぐ下に、作成/保存ボタンを追加することができました。それはデザインの観点からは完全に機能するようです。しかし、コンテンツは、作成/保存ボタンとは別のビューコントローラにあるので、ユーザーがテキストフィールドに入力した内容や内容を実際には取得できません。

このような状況を処理する最善の方法は何ですか?コンテナビューを実際に使用するのは本当にここで最善の方法ですか?これらの入力をテキストフィールドからメインビューコントローラに戻す簡単な方法はありますか?

可能であれば、私は可能性としてストーリーボードに設計作業の多くを維持したいと思います。 Swiftにビューとデザイン要素を追加することが最後の手段になります。しかし、私はかなりのコードを使用して、そのデータをメインのView Controllerに戻す必要があることを確信していますが、これは完全にOKです。

+0

私が理解しているように、BはAの子ビューコントローラですか?それが正しい場合は、あなたのコード内で子供として追加しているかどうか教えてください。 –

+0

@AndriyGordiychuk私は通常のデフォルトのビューコントローラ(ビューコントローラA)を持っていました。私はコンテナのビューをデフォルトのビューコントローラにドラッグしました。ビューコントローラAの内部にビューを作成し、新しいビューコントローラ(ビューコントローラB)を作成しました。これは、コードなしですべてストーリーボードで行われました。ビューコントローラBの内部には、スクロールビューと内容とそのすべてがあります。内部のビューアコントローラAコンテナビュー(ビューコントローラB、いくつかの埋め込みセグなど)と、下部に作成/保存ボタンがあります。 –

+0

@AndriyGordiychukそれが意味をなさないかどうか教えてください。 –

答えて

1

あなたが望む行動を達成するための最も簡単な方法は次のとおりです。

1)IBであなたのために作成された埋め込みセグエのカスタム識別子を指定します。ビューコントローラでオーバーライドprepare(for segue:)機能を

weak var viewControllerB: ViewControllerB? 

3):たとえば、ビューコントローラAでは "embedViewControllerB"

2)は、以下のパラメータを追加します。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "embedViewControllerB" { 
     self.viewControllerB = segue.destination as! ViewControllerB 
    } 
} 

あなたのボタンをクリックしたときに今、あなたはviewControllerB?プロパティを使用してビューコントローラBの内容へのアクセスを得ることができます:セグエは、あなたの埋め込み1そうであれば、Bコントローラへのストアの参照であるかどうかをチェックします。

この段階では、どのように進むかはあなた次第です。 IBOutletsをBのテキストビューに設定し、その内容をAに読み込むか、必要なデータを返すBの関数を実装することができます(タプルのようなものでしょうか?)。

希望します。

+0

申し訳ありませんが、私は返事をするのにはとても時間がかかりました。実装に時間がかかると思った。だから、 'segue.destinationController'の代わりに、将来の視聴者が(Swift 3で)知っているように、' segue.destination'に名前を変更しなければなりませんでした。私はまた、ビューコントローラAの変数にアクセスしようとするとエラーが発生します: '値のタイプ 'UIViewController?'メンバー 'textField'はありません。何か案は? –

+0

'@IBAction var textField:UITextField!'が必要です。それにアクセスする。それ以外の場合は明らかにアクセスできません:) –

+0

View Controller Bで '@IBOutlet var textField:UITextField!'を持っています。 –

関連する問題