質問

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

さて、インターフェイスビルダーを開くと、スーパークラスで宣言されたアウトレットやアクションが表示されないことがわかります。リファクタリングの前にそれらを配線したので、接続はまだ存在しますが、それらは灰色になります。 (私のアクションがボタンを押し、アウトレットが適切に変更されているため、接続も機能することに注意することが重要です。)

問題は、インターフェイスビルダーにスーパークラスのアウトレットを認識するにはどうすればよいですか?これは可能ですか、そうでない場合は、何をお勧めしますか?

(楽しみのために、これが私のスーパークラスのヘッダーファイルです:)

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

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

-(IBAction) buyFullVersion;

@end

編集:誰かが不思議に思っている場合、iOS 4.2 SDKでXcodeとIB 3.2.5を使用しています。

役に立ちましたか?

解決

約1時間前まで、インターフェイスビルダーのスーパークラスに接続することさえできなかったことに気づきませんでした。これは私がこれを行う方法について私が見つけることができる唯一の質問だったので、この質問は古いにもかかわらず、私の答えを追加します。私の答えは、Xcode 3ではなくXcode 4に関するものです。

私の知る限り、アシスタントエディターを使用してスーパークラスのアウトレットに接続することはできませんが、IBの「ファイルの所有者」をクリックすることでそれを行うことができます。これにより、ユーティリティのすべてのアウトレット - >接続検査官が表示されるはずです。その後、CTRL+INSPECTORのアウトレットをクリックし(「+」サインをクリックしてください)、IBのビューにドラッグします。

他のヒント

iboutletの問題の解決策は、クラスタイプをIDINTEPPECTORの基本クラスに変更することです

enter image description here

コントロール +ドラッグアンドドロップを使用して接続します

enter image description here

子どものクラスに戻します

enter image description here

これは私のために働きます

ところで:Xcode 6を使用しました

IBはスーパークラスのアウトレットを見ることができるはずです、私はこれを何度も問題なく行ってきました。スーパークラスを正しくインポートしていることを確認してください(@classの代わりに#importを使用して)? IBには、スーパークラスに戻るための何らかの方法が必要です。

IDインスペクターのスーパーとサブクラスを切り替えることで、クラス全体でアウトレットを接続できます。私が見つけた唯一の問題は、UableViewcellとそのサブクラスでこれを行おうとするときです。デフォルトのTextLabelとDefacerTextLabelインスタンスを、インターフェイスビルダーで作成したラベルに再割り当てしたかったのです。回避策は、代替ラベルを作成し、ゲッターをオーバーライドして代わりにこれらを指すことです。

IBは、スーパークラスではなく、アウトレットを見つけるために使用している実際のクラスのみを見ると確信しています。最も簡単な解決策は、インスタンス変数宣言をスーパークラスに残すことだと思いますが、複製します @property 各サブクラスの線。

Xcode 3.2.6でこれを行っています。私はクラスに接続されたアウトレットから始めてから、追加のアウトレットを備えたサブクラスを作りました。ファイルの所有者クラスをサブクラスに変更したとき、IBはグレイアウトのようにスーパークラスのアウトレットを示しました。ファイルの所有者をスーパークラスに切り替えてから、サブクラスに戻りましたが、今ではすべてのアウトレットがグレイアウトを見せていないことを示しています。

最も簡単な方法:サブクラスのインターフェイスと実装ファイルを作成します。
完璧な例: ジャグルウェア 驚くばかり Shadowbutton Subclass uibuttonの。

プロジェクトで.h&.mファイルを必ず作成してください。注:必要はありません #import これは単に クラスインスタンス uibuttonの。

インターフェイスビルダー:

  1. 接続する要素を選択します。
  2. 行きます ユーティリティ -> 身元検査官
  3. クラスをサブクラス(またはスーパークラス)に変更します。注:サブクラス名を入力してEnterを押す必要がある場合があります。

あなたは終わった!

基本クラス(uibutton)をヘッダーファイルのようにiboutletとして宣言したとしても...

// YourViewController.h

@interface YourViewController : UIViewController {

IBOutlet UIButton *mybutton;
}

...インターフェイスビルダー(ShadowButton)に設定したクラスは、ビューレイヤーにあるため、上書きします。

このアプローチの最大の利点は、コードに厄介な依存関係の問題がないことです。

私が現在働いているプロジェクトでは、 BaseViewController とともに UIScrollView なので IBOutlet キーボードの外観/消失イベントを処理し、それに応じてコンテンツをスライドさせます。最初は、私はそれに接続できませんでした IBOutlet, 、このような問題を解決したよりも、ソシリアの答えに似ています。

  • BaseViewController 持っています IBOutlet, 、呼ばれます contentScrollView. 。私は以前に接続された5つのアウトレットを見ることができます。 UIScrollViews その他 UIViewControllers, 、以前にプロジェクトに取り組んだ人々によって作成されました

  • 私は自分をつなげようとしました UIScrollView として contentScrollView. 。私の UIViewController のサブクラスです BaseViewController, 、接続できません。

  • 私はすでに接続されている接続を試みました UIScrollViews として contentScrollView. 。すべてが UIViewControllers のサブクラスです BaseViewController, 、私もそれらを再び接続することはできません。それで、私はトリックを探し始めました。

  • 同じことを作成しました contentScrollView IBOutlet 私自身 UIViewController, 、接続します scrollView 私自身に contentScrollView 私が作成したものをアウトレットと削除しました。

  • これで、ScrollViewが接続されています contentScrollView ファイルの所有者に、しかし唯一 contentScrollView に属します BaseViewController. 。キーボードイベントが正しく処理されることをテストおよび検証しました。

私はスーパークラスで同様の問題に遭遇しましたが、それはXcode(8.2)のバグが原因で、インターフェイスビルダーが接続検査官にアウトレットが表示されないためです。 _Nullable 迅速な互換性のための注釈を入力します。

使用 nullable Inside @Propertyの括弧は、問題を回避しているようです。

このXcodeバグは、どのクラスのコンセントにも影響を及ぼしているようです(つまり、スーパークラスだけでなく)。

私は同じ問題を抱えていましたが、それはスーパークラスで「_nullable」と宣言されたiboutletsを持っていたからです。例:

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

_nullableを削除したとき、突然ibでibが再び現れ、すべてが再び良くなりました。 (Xcodeが「ポインターにnullabilityタイプ仕様が欠落している」と不満を言っていたため、私はそれらを_nullableに設定しました...(理由はわからない)。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top