2013-02-17 16 views
9

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

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

これらの3つのビューのそれぞれを処理するカスタムUIViewクラスを派生しました。私のビューコントローラは、各クラスをインスタンス化します。 IBでビューを選択し、アイデンティティ・インスペクタを開き、カスタム・クラスにクラスを設定しました。しかし、私は、ビューからの接続をドラッグしようとすると、またはコンポーネントのコントロールをカスタムビューの.hファイルに接続しようとすると、IBは接続を追加しません。

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

この質問は私と同じです:how to connect UIview outlets to a custom subview 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にアウトレットを追加するために何を設定/チェックする必要がありますか?私の経験で

+0

スウェル。だから、私は確かに作成するコントロールを定義することができます、スライダを、手動で、それを私が望む場所に配置します。しかし、私のカスタムクラスの関数にプログラムで(Value Changedのような)アクションを設定する方法はありますか? slider.delegate = myCustomViewを設定しますか? – Thunk

+0

正直、私は知らない。私はInterface Builderが嫌い、まれにしか使用しません。プログラムでアクションを追加するには、 'UIControl'の' addTarget:action:forControlEvents: 'メソッドを使います。 –

+0

* view3と一緒にIBOutletではなく 'self'を使うのはなぜですか? –

答えて

15

私はこれを今日では動作させましたが、アウトレットを派生クラスに手作業で挿入する必要がありました。その後、ヘッダーファイルからストーリーボードのUI要素にドラッグできましたが、まわり。

+0

これは承認された回答でなければなりません。実際に、.h/.mでOutlet/Actionプロトタイプを作成し、プロトタイプからIB要素に接続をドラッグすると、接続を作成することはできません。 –

+0

これは私のために働く。ファイルにIBOutletを入力し、ファイルからストーリーボードにドラッグします。 – SimplGy

+0

完璧に動作します。それが逆の方法ではうまくいかない理由がわからないので、プロセスが直感的ではありません。 –

0

は、あなたがのUIViewControllerのサブクラスとのUIViewのサブクラスではないにIBActionやIBOutletを追加します。そのため、MVCモデルでは、 "1" UIViewControllerにこれらのIBOutletがすべて含まれているので、これらのIBOutletsのデータを使用してビューを更新します。

ですから、IBでUIViewsオブジェクトを微作成しているし、コードに対応するクラスを作成し、あなたのUIViewのサブクラスにIBでUIViewsオブジェクトのクラスを変更します。すべてのIBOutletをすべてのUIViewを含むUIViewControllerに配置し、必要な値をIBOutletsから取得し、UIViewサブクラスに渡します(設定します)。

これが役に立ちます。

+1

私の目標は、1つの巨大なビューコントローラ内の多くのオブジェクトのすべてのコードを持っているわけではありません。それが私がしないことです。私は別のクラス(UIViewクラスである必要はありませんが、IBとの最も論理的なペアリングのように見える)でハンドラを分散し、それらのコントロールが関連付けられているタスクでグループ化したいと思います。 – Thunk

2

アップルにバグがありました。何か面白いことが起こったら、私はこの答えを更新します。

更新日10/4/13:多くの研究の後で、IBがクラス内のプロパティにオブジェクトを接続しようとしていると信じているようです。 IBは、どのインスタンスがメッセージを処理すべきかを知ることができない。それで、私は(潜在的に)1つのオブジェクトから複数のインスタンスにわたるプロパティの複数のコピーへの同時接続を確立しているという信念の上に、接続を許可しません。

私の見解は、私が唯一のカスタムUIViewのの単一のインスタンスをしたいということです、と私は、IBを伝えることができるはずという「慌てないでください、あなたはこれだけのインスタンスを扱っています。」

私は現在新しいプロジェクトに注力しており、Xcode 5でこれを再試行する機会はありませんでした。しかし、上記の情報を考えれば、Xcode 5でもうまくいくとは思えません。

1

あなたがしようとしていることは確かに分かりやすい(IMO)と可能です。しかし、Xcodeは、サブビュー内のアウトレットへの接続を確立することに関してはかなり奇抜です。

私は、XCodeのクリーニング、再構築、時には再起動が役立つ傾向にあることを発見しましたが、時には機能しないことがあります。場合によっては、手動でコンセントを作成し、コンセントからコントロールにドラッグすることで、それを動作させることもできます。

これはあまり役に立ちませんが、私はちょうどと考えていましたが、とするとXCodeのバグが原因です。

0

私は同じ問題を抱えていたし、回避策が見つかりました:

1)でUISliderから右

2)のctrl +ドラッグで左とcustomView3.hにcustomView3.xibとアシスタントエディタを開きますcustomView3.xibを右側のcustomView3.hコードに追加

3)新しいアウトレット接続を作成するオプションがポップアップします。

4)は、接続に名前を付け、それは、その後、接続IBOutletを作成します

を接続します。

関連する問題