9

Xcode 4.3.3 を使用すると、カスタム UIView クラスのアウトレットを Interface Builder で作成されたオブジェクトに接続する方法がわかりません。

1 つの ViewController には、ビューにグループ化しようとしているさまざまなボタン、スライダーなどがあります。そのため、IB の ViewController 内に 3 つのビューを追加しました。一度に表示できるビューは 1 つだけです。

これら 3 つのビューのそれぞれを処理するカスタム UIView クラスを派生させました。私のView Controllerは各クラスをインスタンス化します。IB でビューを選択し、Identity Inspector を開き、クラスをカスタム クラスに設定しました。しかし、ビューおよび/または構成要素のコントロールからカスタム ビューの .h ファイルに接続をドラッグしようとすると、IB は接続を追加しません。

IB では、カスタム ビューの .h ファイルではなく、親ビュー コントローラーの .h にドラッグしてアウトレット/アクションを追加できます。ビューのクラスをカスタム クラスに設定したら、ビューのコンポーネントのアウトレットをビュー コントローラーではなくカスタム クラスにドラッグできると思いました。

UIviewアウトレットをカスタムサブビューに接続する方法2つの解決策(アウトレットを手動で追加し、IBでビューのクラスを設定する)は、私の動作を変更しませんでした。追加した手動アウトレットは次のとおりです。

customView3.h

#import <UIKit/UIKit.h>

@interface customView3 : UIView

@property (retain) IBOutlet customView3 *view3;
@property (retain) IBOutlet UISlider *slider;

@end

customView3.m

#import "customView3.h"

@implementation customView3

@synthesize view3, slider;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
    // Initialization code
    }
    return self;
}
@end

ここで何が欠けていますか?ビュー コントローラーではなくカスタム UIView にアウトレットを追加するには、他に何を設定/確認する必要がありますか?

4

5 に答える 5

2

Appleでバグを開いた。何か面白いことが起こったら、この答えを更新します。

2013年10月4日更新:多くの調査の結果、問題の根本は、オブジェクトをクラス内のプロパティに接続しようとしているとIBが信じていることであり、このインスタンスの群れを作成することになっているようです。クラスの場合、IBはどのインスタンスがメッセージを処理する必要があるかを判断できません。したがって、クラスの複数のインスタンスにわたって、1つのオブジェクトからプロパティの複数のコピーへの同時接続を(潜在的に)行っているという信念に基づいて接続を許可しません。

私の見解では、カスタムUIViewのインスタンスは1つだけ必要であり、「慌てる必要はありません。この1つのインスタンスのみを処理している」とIBに伝えることができるはずです。

私は今、新しいプロジェクトに集中していて、Xcode5でこれを再試行する機会がありませんでした。ただし、上記の情報を考えると、Xcode5でも機能するかどうかは楽観的ではありません。

于 2013-02-22T20:44:28.100 に答える
1

あなたがやろうとしていることは確かに賢明(IMO)であり、可能です。ただし、サブビューでアウトレットへの接続を確立する場合、XCode は非常に風変わりです。

XCode のクリーニング、再構築、および場合によっては再起動が役立つ傾向があることがわかりましたが、うまくいかない場合もあります。場合によっては、アウトレットを手動で作成し、アウトレットからコントロールにドラッグすることで、他の方法ではなく動作させることができました。

これはあまり役に立たないことはわかっていますが、これが機能するはずであり、機能しない場合は、XCode のバグが原因であることが最も確実であることを明確にしたかっただけです。

于 2013-07-05T00:42:33.810 に答える
0

私の経験では、UIView のサブクラスではなく、UIViewController のサブクラスに IBAction と IBOutlet を追加します。したがって、MVC モデル内では、「1」UIViewController にこれらの IBOutlets がすべて含まれており、これらの IBOutlets からのデータを使用してビューを更新します。

したがって、IB で UIViews オブジェクトを作成し、コードで対応するクラスを作成してから、IB で UIViews オブジェクトのクラスを UIView サブクラスに変更しても問題ありません。その下にすべてのUIViewがあるUIViewControllerにすべてのIBOutletsを配置し、IBOutletsから必要な値を取得してから、それらをUIViewサブクラスに渡す(設定する)だけです。

お役に立てれば。

于 2013-02-17T13:29:24.397 に答える