スーパークラスで宣言されたiBoutletsにアクセスする方法は?
-
09-10-2019 - |
質問
私は現在、いくつかを共有するいくつかのビューコントローラーをリファクタリングしています IBOutlet
砂 IBAction
方法。アウトレット宣言を移動しました 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の基本クラスに変更することです
コントロール +ドラッグアンドドロップを使用して接続します
子どものクラスに戻します
これは私のために働きます
ところで:Xcode 6を使用しました
IBはスーパークラスのアウトレットを見ることができるはずです、私はこれを何度も問題なく行ってきました。スーパークラスを正しくインポートしていることを確認してください(@classの代わりに#importを使用して)? IBには、スーパークラスに戻るための何らかの方法が必要です。
IDインスペクターのスーパーとサブクラスを切り替えることで、クラス全体でアウトレットを接続できます。私が見つけた唯一の問題は、UableViewcellとそのサブクラスでこれを行おうとするときです。デフォルトのTextLabelとDefacerTextLabelインスタンスを、インターフェイスビルダーで作成したラベルに再割り当てしたかったのです。回避策は、代替ラベルを作成し、ゲッターをオーバーライドして代わりにこれらを指すことです。
IBは、スーパークラスではなく、アウトレットを見つけるために使用している実際のクラスのみを見ると確信しています。最も簡単な解決策は、インスタンス変数宣言をスーパークラスに残すことだと思いますが、複製します @property
各サブクラスの線。
Xcode 3.2.6でこれを行っています。私はクラスに接続されたアウトレットから始めてから、追加のアウトレットを備えたサブクラスを作りました。ファイルの所有者クラスをサブクラスに変更したとき、IBはグレイアウトのようにスーパークラスのアウトレットを示しました。ファイルの所有者をスーパークラスに切り替えてから、サブクラスに戻りましたが、今ではすべてのアウトレットがグレイアウトを見せていないことを示しています。
最も簡単な方法:サブクラスのインターフェイスと実装ファイルを作成します。
完璧な例: ジャグルウェア 驚くばかり Shadowbutton Subclass uibuttonの。
プロジェクトで.h&.mファイルを必ず作成してください。注:必要はありません #import
これは単に クラスインスタンス uibuttonの。
の インターフェイスビルダー:
- 接続する要素を選択します。
- 行きます ユーティリティ -> 身元検査官
- クラスをサブクラス(またはスーパークラス)に変更します。注:サブクラス名を入力して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に設定しました...(理由はわからない)。)