web-dev-qa-db-ja.com

IBOutletはカスタムUIView内ではnilです(STORYBOARDを使用)

カスタムのUIViewクラスがあります。その中で、IBOutletUIImageViewプロパティを宣言しました。

#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を指していることを確認しました。何かが足りません。私は助けをグーグルで検索しましたが、解決策が見つかりませんでした。

私が間違っていることを指摘していただけますか?

19
padam thapa

ビューでawakeFromNibをオーバーライドします-これは、IBOutletsが割り当てられた後に呼び出される最初のライフサイクルメソッドであり、コードに適した場所です。

71
Oliver Dungey

awakeFromNibでそれらを初期化します。

- (void)awakeFromNib
{
    //init code
}
3
inix

私はまったく同じ問題を抱えていましたが、解決策は本当に簡単です。

間もなくmyImageにアクセスします-それだけです。

-(id) initWithCoder:(NSCoder *)aDecoder{- (id)initWithFrame:(CGRect)frameを使用すると、UIViewはまだ描画されていません。したがって、myImageはまだ初期化されていません。

UIButtonIBActionを追加して、次のようにすると、テストできます。

- (IBAction)buttonClicked:(id)sender {
    NSLog(@"%@",myImage);
}

そして、myImagenilではなくなったことがわかります。

2
Fabio Poloni

プロパティにセッターを使用することはできません。そうすれば、実際にデータが入力されたときに必要なことを実行できますか?

@IBOutlet weak var xxx:UIKitClass! {
  didSet { 
    outletSetup() 
  }
}
0
Apixel

同様の問題がありましたが、最終的に何が問題なのかがわかりました。これは、XIBファイルとストーリーボードのイディオムの違いでした。

Xibファイルで見たすべてのチュートリアルで、UITableViewControllerがDetailViewControllerを作成してテーブル内のアイテムのコンテンツを編集できるようにした場合、tableViewControllerはDVCのインスタンスを最初に公開したときに一度作成しましたが、その後、リスト上の別のアイテムを編集する必要があるときはいつでも、同じDVCインスタンスを再利用しました。

ストーリーボードでは、テーブルビューによって表示されるビューは、通常、テーブルビューが呼び出すたびに新しく作成されるように見えます(UIViewControllerテンプレートにあるinitのバージョンは呼び出されません)。前の回答で述べたように、以前にこのビューを表示したことがある場合でも、「ViewDidLoad」がいずれかのコントロールにアクセスするまで待つ必要があります。

これがお役に立てば幸いです。

0
Harlan Howe