17

私は現在、いくつかIBOutletのsとIBActionメソッドを共有するいくつかのViewControllerをリファクタリングしています。アウトレット宣言とIBActionメソッドをスーパークラスに移動し、これらをサブクラスから除外しました。

さて、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

編集:誰かが疑問に思っている場合に備えて、私はiOS4.2SDKでXcodeとIB3.2.5を使用しています。

4

10 に答える 10

23

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

私が知る限り、アシスタント エディターを使用してスーパークラスのアウトレットに接続することはできませんが、IB の [ファイルの所有者] をクリックすることで接続できます。Utilities->Connections Inspector にすべてのアウトレットが表示されます。次に、インスペクターでアウトレットを Ctrl+クリック (「+」記号をクリック) し、IB のビューにドラッグします。

于 2012-11-06T06:04:32.540 に答える
3

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

于 2010-12-13T18:19:31.743 に答える
3

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

于 2013-02-28T13:07:14.320 に答える
0

最も簡単な方法:サブクラスのインターフェイスファイルと実装ファイルを作成します。
完璧な例:UIButtonのJugglewareの素晴らしいShadowButtonサブクラス

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

Interface Builderの場合

  1. 接続する要素を選択します。
  2. [ユーティリティ] ->[ IDインスペクター]に移動します
  3. クラスをサブクラス(またはスーパークラス)に変更します。注:サブクラス名を入力してEnterキーを押す必要がある場合があります。

完了です。

基本クラス(UIButton)をヘッダーファイルでIBOutletとして宣言した場合でも...

// YourViewController.h

@interface YourViewController : UIViewController {

IBOutlet UIButton *mybutton;
}

... Interface Builder(ShadowButton)で設定したクラスは、ビューレイヤーにあるため、上書きされます。

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

于 2013-02-25T04:30:24.840 に答える
0

私が現在取り組んでいるプロジェクトではBaseViewControllerUIScrollViewas がIBOutletあり、キーボードの出現/消失イベントを処理し、それに応じてコンテンツをスライドさせます。IBOutlet最初は、Sosily の答えに似たこのような問題を解決するよりも、それに接続できませんでした。

  • BaseViewControllerIBOutletと呼ばれるがありcontentScrollViewます。以前にプロジェクトに取り組んだ人々によって作成された、UIScrollViews他のにある、以前に接続された 5 つのアウトレットが表示されます。UIViewControllers

  • UIScrollViewとして接続しようとしましたcontentScrollView。myUIViewControllerは のサブクラスですがBaseViewController、接続できません。

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

  • contentScrollView IBOutlet私は自分で同じものを作成し、自分のコンセントUIViewControllerに接続し、作成したばかりのものを削除しました。scrollViewcontentScrollView

  • 現在、scrollView はcontentScrollViewファイルの所有者として接続されていますが、唯一のcontentScrollViewものはBaseViewController. キーボード イベントが正しく処理されることをテストして確認しました。

于 2015-09-18T07:49:40.877 に答える
0

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

于 2013-02-01T21:16:19.463 に答える
0

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

于 2010-12-13T18:11:17.597 に答える
0

_Nullableスーパークラスで同様の問題に遭遇しましたが、これは Xcode (8.2) のバグによるもので、Swift 互換性のためにアウトレットが型注釈で宣言されている場合、Interface Builder が接続インスペクターでアウトレットを表示しません。

@propertynullableの括弧内で使用すると、問題を回避できるようです。

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

于 2017-01-12T03:17:03.067 に答える
0

私は同じ問題を抱えていましたが、スーパークラスで IBOutlets を「_Nullable」と宣言したことが原因であることがわかりました。例:

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

_Nullable を削除すると、突然 IBOutlets が IB に再表示され、すべて正常に戻りました。(Xcode が「ポインターに null 許容型指定子がありません」と不平を言っていたため、それらを _Nullable に設定しただけでした... (理由はわかりません)。)

于 2017-01-14T00:56:36.323 に答える