カスタムのUIView
クラスがあります。その中で、IBOutlet
のUIImageView
プロパティを宣言しました。
#import <UIKit/UIKit.h>
@interface SettingItem : UIView{
}
@property (strong, nonatomic) IBOutlet UIImageView *myImage;
@end
今は絵コンテを使っています。ビューコントローラーがあります。 UIView
をviewcontrollerにドラッグしました。上記のUIImageView
のサブビューとして1つのUIView
をドラッグしました。ストーリーボードから「SettingItem」クラスをUIView
に設定しました。ユーティリティウィンドウからSettingItem
のアウトレットから通常ドラッグして、アウトレットをmyImageに接続しました。
SettingItem
の実装#import "SettingItem.h"
@implementation SettingItem
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
[self baseInit];
}
return self;
}
-(id) initWithCoder:(NSCoder *)aDecoder{
self = [super initWithCoder:aDecoder];
if (self) {
// Initialization code
[self baseInit];
}
return self;
}
- (void) baseInit{
NSLog(@"myImage %@"self.myImage);
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
// Drawing code
}
*/
@end
今私の問題はmyImage
が常にnil
であり、NSLog
の上にアウトレットの(null)
を出力するだけです。ストーリーボードでビューを確認し、そのアウトレット参照とmyImage
を指していることを確認しました。何かが足りません。私は助けをグーグルで検索しましたが、解決策が見つかりませんでした。
私が間違っていることを指摘していただけますか?
ビューでawakeFromNibをオーバーライドします-これは、IBOutletsが割り当てられた後に呼び出される最初のライフサイクルメソッドであり、コードに適した場所です。
awakeFromNibでそれらを初期化します。
- (void)awakeFromNib
{
//init code
}
私はまったく同じ問題を抱えていましたが、解決策は本当に簡単です。
間もなくmyImage
にアクセスします-それだけです。
-(id) initWithCoder:(NSCoder *)aDecoder{
と- (id)initWithFrame:(CGRect)frame
を使用すると、UIView
はまだ描画されていません。したがって、myImageはまだ初期化されていません。
UIButton
とIBAction
を追加して、次のようにすると、テストできます。
- (IBAction)buttonClicked:(id)sender {
NSLog(@"%@",myImage);
}
そして、myImage
がnil
ではなくなったことがわかります。
プロパティにセッターを使用することはできません。そうすれば、実際にデータが入力されたときに必要なことを実行できますか?
@IBOutlet weak var xxx:UIKitClass! {
didSet {
outletSetup()
}
}
同様の問題がありましたが、最終的に何が問題なのかがわかりました。これは、XIBファイルとストーリーボードのイディオムの違いでした。
Xibファイルで見たすべてのチュートリアルで、UITableViewControllerがDetailViewControllerを作成してテーブル内のアイテムのコンテンツを編集できるようにした場合、tableViewControllerはDVCのインスタンスを最初に公開したときに一度作成しましたが、その後、リスト上の別のアイテムを編集する必要があるときはいつでも、同じDVCインスタンスを再利用しました。
ストーリーボードでは、テーブルビューによって表示されるビューは、通常、テーブルビューが呼び出すたびに新しく作成されるように見えます(UIViewControllerテンプレートにあるinitのバージョンは呼び出されません)。前の回答で述べたように、以前にこのビューを表示したことがある場合でも、「ViewDidLoad」がいずれかのコントロールにアクセスするまで待つ必要があります。
これがお役に立てば幸いです。