1

マスター詳細ナビゲーションをセットアップしようとしています。ストーリーボードを使用します。マスターは動的テーブルで、詳細は静的テーブルです。 絵コンテ コントローラーのアウトレットとして nameLabel をセットアップしましたが、viewDidLoad でそれにアクセスしようとすると、まだ nil に設定されています。

prepareForSegue を使用する代わりに、次のように詳細ビューをプッシュする didSelectRowAtIndexPath を使用しました (TableViewBindingHelper を使用しているため、https: //github.com/ColinEberhardt/ReactiveTwitterSearch/tree/master/ReactiveTwitterSearch/Util を参照)

    func showLessonView(lessonVM: LessonViewModel) {

        let lessonViewController = LessonViewController(WithViewModel: lessonVM)
        self.navigationController?.pushViewController(lessonViewController, animated: true)

    }

レッスンビューコントローラー:

import Foundation
import ReactiveCocoa

class LessonViewController: UITableViewController {

@IBOutlet var lessonNameLabel: UILabel!

private var viewModel: LessonViewModel

init(WithViewModel viewModel: LessonViewModel){
    self.viewModel = viewModel
    super.init(nibName: nil, bundle: nil)
}

required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

override func viewDidLoad() {
    super.viewDidLoad()
    bindData()
}

func bindData() {
    // null here!
    if (lessonNameLabel != nil) {
        lessonNameLabel.rac_text <~ viewModel.name
    }
}
}

どうすればこれを修正できますか?

私が見た他のサンプルコードは、 init(coder aDecoder: NSCoder) コンストラクターを呼び出すセグエでナビゲーションを実行し、すべてのアウトレットは既に初期化されています。

4

1 に答える 1

1

イニシャライザでビュー コントローラを初期化するため、ビュー コントローラWithViewModelはストーリーボードについて何も認識しないため、アウトレットは接続されません。ストーリーボードで指定されているようにアウトレットを接続するには、セグエを使用するか、ストーリーボードのinstantiateViewControllerWithIdentifier(identifier:)メソッドを使用してビュー コントローラーを作成する必要があります。いずれにせよ、ViewModel を初期化の引数として (簡単に) 渡すことはできないため、viewModel 変数を公開 (削除private) し、メソッドで個別に設定する必要がありますshowLessonView。を使用するinstantiateViewControllerWithIdentifier(identifier:)Lesson View Controllerは、ストーリーボードで識別子 (「LessonViewController」など) を指定します。showLessonView次に、次のように修正します。

func showLessonView(lessonVM: LessonViewModel) {
    let lessonViewController = self.storyboard!.instantiateViewControllerWithIdentifier(identifier:"LessonViewController") as! LessonViewController
    lessonViewController.viewModel = lessonVM
    self.navigationController?.pushViewController(lessonViewController, animated: true)
}

ビュー コントローラーがストーリーボードからインスタンス化されると、init(coder:)初期化子が使用されるため、そのメソッドのオーバーライドを削除するか、スーパー実装を呼び出すように修正します。

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}
于 2015-07-06T20:33:50.403 に答える