2010-12-13 14 views
12

ねえ、私は現在、いくつかのIBOutletIBActionのメソッドを共有するビューコントローラをリファクタリングしています。アウトレット宣言とIBActionメソッドをスーパークラスに移動し、これらをサブクラスから切り離しました。スーパークラスで宣言されたIBOutletsにアクセスするには?

Interface Builderを開くと、スーパークラスで宣言されているアウトレットやアクションが表示されません。私はリファクタリングの前にそれらを配線していたので、接続はまだ存在しますが、グレーアウトされています。 (ボタンが押されたときにアクションが発生し、アウトレットが正しく変更されているため、接続も機能していることに注意することが重要です)。

スーパークラスのアウトレットを認識するにはどうすればよいですか?これは可能ですか?もしそうでなければ、何をお勧めしますか?

は(ちょうど楽しみのために、ここに私のスーパークラスのヘッダファイル:)だ

@interface TFMainViewController : UIViewController { 
    UIImageView *logoImage, *thinkfunImage; 
    UIButton *buyFullButton;   
} 

@property (nonatomic, retain) IBOutlet UIImageView *logoImage, *thinkfunImage; 
@property (nonatomic, retain) IBOutlet UIButton *buyFullButton; 

-(IBAction) buyFullVersion; 

@end 

EDIT:誰もが不思議だ場合には、私はiOSの4.2 SDKで、XcodeとIB 3.2.5を使用しています。

+0

これが可能かどうかは、私は同じことを望んでいたが、私はサブクラスでそれを再宣言しなければIBはプロパティを認識していないようだ? – Rog

+0

この商品の最新情報を希望する私はここで同じ問題が発生しています。これはインストーラプラグインのスーパークラス(InstallerPane)で、私のものではないので変更できません。ドキュメントでは、自分の.xibをスーパークラスのいくつかのプロパティに接続する必要があると言います。 !の仕方? –

答えて

18

約1時間前までは、インタフェースビルダーのスーパークラスに接続することさえ可能ではないことに気付きませんでした。これが唯一の問題だったので、この質問は古いですが、答えを追加します。私の答えは、Xcode 3ではなく、Xcode 4に関するものです。

助手席エディタを使ってスーパークラスのアウトレットに接続することはできませんが、「File's Owner IBの中で。 Utilities> Connections Inspectorにすべてのアウトレットが表示されます。インスペクタのコンセントをCtrl +クリック(「+」記号をクリック)して、IBのビューにドラッグすることができます。

+1

これは受け入れられる回答である必要があります。ありがとうございました! – NathanAldenSr

+1

または、Cmd-Clickで補助エディタのスーパークラスにナビゲートしてから、クラスをIBにドラッグするか、その逆にドラッグしてコンセントに接続するか、コンセントに接続するか、新しいコンセントを作成します。 –

1

私はIBがスーパークラスではなくアウトレットを探すのに使っている実際のクラスだけを見ていることは間違いありません。私は最も簡単な解決策は、インスタンス変数の宣言をスーパークラスに残し、各サブクラスに@property行を複製することだと思います。

+0

実際にはInterface Builder *はスーパークラスのプロパティをリストしますが、スーパークラスのヘッダーファイルで宣言し、そのヘッダーをサブクラスでインポートする必要があります(Kendall氏)。 – Brian

2

IBはスーパークラスからコンセントを見ることができるはずですが、何度もこの問題を解決しました。スーパークラスを正しくインポートしようとしていますか(@classの代わりに#importを使用しています)? IBはスーパークラスを追跡するために何らかの方法を必要とします。

+0

Kendall、他の答えを見て、何かを複製しているのですか、スーパークラスの宣言全体ですか?私は '#import'を使用しており、サブクラス内のプロパティにアクセスできるので、ヘッダーインポートの動作を知ることができます。 –

+0

私はちょうどこれのためのテストプロジェクトを作成した - それは動作しません。 Xcode 7.x以降 - IBは、そのスーパークラスのものではなく、オブジェクトに対して宣言された実際のクラスのIBOutletのみを表示します。 –

+0

私はSwiftのXcode 7.3でこれをやりとりしていましたが、それでも正常に動作します。私は、スーパークラスで宣言されたIBOutletをIBにドラッグするか、IBからコンセントにドラッグして接続することができました。アシスタントエディタは、自動セクションにスーパークラスを表示しませんが、そこをナビゲートすることができ、IBはアウトレットをサブクラスから来るように表示します(これは技術的に正確です)。 @ SamRitchie - 何も複製せず、サブクラスではなく、スーパークラスのコンセントを持っています。 –

0

私はXCode 3.2.6でこれをやっています。私はクラスに接続されたアウトレットから始め、追加のアウトレットを持つサブクラスを作成しました。 FileのOwnerクラスをサブクラスに変更したとき、IBはスーパークラスのアウトレットをグレー表示していました。 File's Ownerをスーパークラスに切り替えた後、サブクラスに戻り、すべてのアウトレットがグレー表示されないように表示します。

0

最も簡単な方法:あなたのサブクラスのためのインターフェイスと実装ファイルを作成する!
完璧な例:Juggleware's UButtonの素晴らしいShadowButton Subclass

プロジェクトに.h & .mファイルを作成してください。 注:UButtonのクラスインスタンスであるため、ヘッダーファイルはまったく#importにする必要はありません。

Interface Builderの で:

  1. 接続するための要素あなたを選択します。>アイデンティティインスペクタ
  2. 変更サブクラス(またはスーパー)までクラス - ユーティリティから
  3. 移動します。注:サブクラス名を入力してEnterキーを押す必要があるかもしれません。

完了です!あなたがそうのようなあなたのヘッダファイルにIBOutletなどの基本的なクラス(UIButton)を宣言した場合であっても

...

// YourViewController.h 

@interface YourViewController : UIViewController { 

IBOutlet UIButton *mybutton; 
} 

...あなたがInterface Builderの(ShadowButton)に設定したクラスが上書きされますそれはビューレイヤー内にあるからです。

このアプローチの最も重要な点は、コードには複雑な依存関係の問題がないことです。

3

アイデンティティインスペクタでスーパークラスとサブクラスを切り替えると、クラス間でアウトレットを接続できます。私が見つけた唯一の問題は、UITableViewCellとそのサブクラスでこれを実行しようとしたときです。 Interface Builderで作成したラベルにデフォルトのtextLabelインスタンスとdetailTextLabelインスタンスを再度割り当てたいと思っていました。この問題を回避するには、代用ラベルを作成し、ゲッターをオーバーライドして代わりにこれらを指すようにします。

11

IBOutletに伴う問題に対する解決策は..

enter image description here

コントロール+ドラッグアンドドロップと

enter image description hereを使用して接続アイデンティティインスペクタの基本クラスにクラスタイプを変更することです

子供のクラスに戻す

私は現在働いているプロジェクトではXcodeの6

+1

私は同じ問題があります。それをNSCollectionViewItemで試したので、textFieldアウトレットに接続できますが、まだ動作していません。 – pvinis

0

を使用し、我々はIBOutletとしてUIScrollViewBaseViewControllerを持っており、キーボード出現/消滅イベントを処理し、スライド:これは私のため

がところで作品

それに応じてコンテンツ。

  • BaseViewControllercontentScrollViewと呼ばれる、IBOutletがありますSosilyの答えに似ている、このような問題を、解決するよりも、最初は、私は、そのIBOutletに接続できませんでした。私は以前、私は私のUIScrollViewcontentScrollViewとして接続しようとしたプロジェクト

  • で働いた人々によって作成された他のUIViewControllersUIScrollViewsある5つの以前に接続コンセントを、見ることができます。私のUIViewControllerBaseViewControllerのサブクラスですが、接続できません。

  • すでに接続してみましたが、UIScrollViewscontentScrollViewです。すべてUIViewControllersBaseViewControllerのサブクラスですが、再び接続することはできません。だから、私はトリックを探し始めました。

  • 私は自分のcontentScrollViewコンセントにscrollViewを接続して、私はちょうど作成したものを取り出し、自分UIViewControllerで同じcontentScrollViewIBOutletを作成しました。

  • scrollviewはcontentScrollViewとしてFile's Ownerに接続されますが、contentScrollViewBaseViewControllerにのみ属しています。テストし、キーボードイベントが正しく処理されていることを確認しました。

0

私はスーパークラスと同様の問題に遭遇したが、それは、これらのコンセントは_Nullableで宣言されている場合にInterface BuilderがConnectionインスペクタで店舗を表示しませんXcodeでのバグ(8.2)によるものでしたSwiftとの互換性のために型の注釈を使用します。

@プロパティのかっこ内にnullableを使用すると、この問題を回避できるようです。

このXcodeのバグは、どのクラス(つまりスーパークラスだけでなく)のアウトレットにも影響するようです。

0

私は同じ問題を抱えていました。それは、スーパークラスでは "_Nullable"として宣言されたIBOutletがあったからです。 例:私は_Nullableを削除する場合

@property (nonatomic, strong) IBOutlet UITableView *_Nullable mySuperTableView; 

、突然IBOutletsはIBに再び現れ、すべてが再び良かったです。 (私は_Nullableに設定していました。なぜなら、Xcodeは "ポインタにNULL値の型指定子がありません"と不満を表明していたからです。)(理由はわかりません)

関連する問題