37

ストーリーボードを使用していますが、配線したものがすべてまだゼロでinstantiateViewControllerWithIdentifier:あることに気づいています。IBOutletsしかし、IBActions私は仕事を配線しました。ビューとコントローラーはリンクされており(つまり、controller.viewはnilではありません)、ビューを表示すると、期待しているものが表示されます。

私は何が欠けていますか?

これが私の設定です:

  1. ストーリーボードにViewControllerが定義されています。呼び出すときに使用するのと同じ識別子を指定しましたinstantiateViewControllerWithIdentifier:
  2. ビューコントローラー(First Responderのすぐ下)をクリックしてビューの所有者を設定し、Identity Inspectorで、ビューを接続するクラスと同じ名前にカスタムクラスを設定しました。
  3. 次に、アシスタントエディターを開き、UI要素をコントロールドラッグしてとを作成しIBOutletsますIBActions
4

6 に答える 6

71

ビューは、最初にアクセスされた後でのみ正しく初期化されているようです。電話をかけると問題が解決します

[self presentViewController:vc animated:NO completion:nil];

またはもっと簡単に

[vc view];
于 2012-12-06T01:53:50.570 に答える
4

[悪い例として私を使ってください]

結局のところ良い考えではないかもしれませんが、それは機能しますが、通常の読み込みに違反し、アプリを不安定にします^_^。
他の誰かがあなたがそれをするかどうか知りたがっている場合に備えて、私はここに答えを残しておきます。


同じ問題が発生していましたが、設計したカスタムコンポーネントがpresentViewControllerを介してロードされていません(前のビューにオーバーレイでロード)

あなたは単に呼び出すことができます

myViewController.loadView()//迅速

[myViewController loadView]// Obj-C

于 2016-06-15T11:24:42.077 に答える
0

アウトレットはKeyValueCodingで確立され、これをViewControllerサブクラスに入れることができます。

- (void)setValue:(id)value forKeyPath:(NSString *)keyPath {
    [super setValue:value forKeyPath:keyPath];
}

- (void)setValue:(id)value forKey:(NSString *)key {
    [super setValue:value forKeyPath:key];
}

そして、superへの2つの呼び出しにブレークポイントを設定します。

デバッガーでは、次のことを試してみます。

  1. アウトレットを適用していると思われるビューコントローラと「自己」を比較します。おそらく、ストーリーボードには、予期しない2番目のビューコントローラがあります。あなたが「所有者を設定する」と言ったとき、それは奇妙な用語だと思いました。すでに存在する表現に加えて、View Controllerを表すためにキューブオブジェクトの1つをドラッグしましたか?

  2. [self valueForKey:key]または[self valueForKeyPath:keyPath]、あるいは単に[selfoutletName]をsuperへの呼び出し後に渡された値と比較します。たぶん、あなたはあなたが意図したことをしていないセッターを持っています。このような間違いが2、3回発生し、「firstName」のような名前のオブジェクトのアウトレットがあり、次にセレクター「setFirstName:」のアクションが発生するのを目にしました。これはキー値のコーディングを混乱させ、最終的にsetFirstName:アウトレットを確立する目的でペン先の読み込み中に呼び出されますが、アウトレットのセッターはアクションメソッドとして実装されるため、アウトレットが設定されることはありません。

于 2012-09-21T04:54:27.320 に答える
0

インスタンス化されたViewControllerのフレームを設定すると、IBOutletsが設定されるようです。

元:

DemoViewController *demoVC = [[self storyboard] instantiateViewControllerWithIdentifier:@"demoVC"];
demoVC.frame = self.view.frame; //or CGRectMake(0, 0, 1015, 604);

これにより、Label、TextField、Button、TableなどのDemoViewControllerのIBOutletsが初期化されます。

お役に立てれば。

于 2013-01-28T10:41:05.523 に答える
0

リンク先のオブジェクトがArrayControllerのようにシーンの最上位エンティティである場合、参照はビュー階層によって保持されないため、強い(弱いではない!)必要があります。弱参照は、あなたが説明するような問題を引き起こす可能性があります。

詳細については、こちらをご覧ください:IBOutletsは、ARCの下で強いか弱いか。

于 2016-05-26T18:35:21.043 に答える
0

人々はビューをロードする方法の解決策を提供しました(そのうちのいくつかは決して使用しないでください(loadView())ので、ここにあなたのビューがすでにロードされているかどうかをチェックする方法があります

didSetアウトレットがまだ設定されていない場合は明らかに機能しないUIを更新するオブザーバーを持つプロパティがあったため、問題が発生しました。これを回避する方法のサンプルコードを次に示します。

var name: String? {
    didSet {
        updateNameLabel()
    }
}

override func viewDidLoad() {
    super.viewDidLoad()

    updateNameLabel()
}

func updateRoomLabel() {
    guard isViewLoaded() else {
        return
    }
    [...]
}

したがって、アウトレットを表示すると、プロパティが更新されるたびに更新されます。

于 2016-09-26T15:05:06.677 に答える