21

私はカスタムUIViewクラスを持っています。IBOutletその中で、 のプロパティを宣言し ましたUIImageView

#import <UIKit/UIKit.h>

@interface SettingItem : UIView{

}

@property (strong, nonatomic) IBOutlet UIImageView *myImage;

@end

今、私はストーリーボードを使用しています。ビューコントローラーがあります。ビューコントローラーにドラッグUIViewしました。UIImageView上記のサブビューとしてドラッグしました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。私は何かが欠けています。グーグルで助けを求めましたが、解決策が見つかりませんでした。

私が間違っていることを指摘してもらえますか?

4

7 に答える 7

77

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

于 2014-06-26T13:11:39.363 に答える
2

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

あなたはmyImageすぐにアクセスしています - それだけです。

Withing-(id) initWithCoder:(NSCoder *)aDecoder{とThe はまだ描画され- (id)initWithFrame:(CGRect)frameUIViewいません。したがって、myImage はまだ初期化されていません。

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

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

そして、あなたはもはやmyImageそうではないことがわかりnilます。

于 2013-01-13T18:26:15.323 に答える
0

私は同様の問題を抱えていましたが、最終的に何が間違っているのかを突き止めました.XIBファイルとストーリーボードのイディオムの違いでした。

Xib ファイルで見たすべてのチュートリアルで、UITableViewController に DetailViewController を作成させてテーブル内の項目のコンテンツを編集させた場合、tableViewController は DVC のインスタンスを最初に表示したときに 1 回作成しましたが、その後、リストの別のアイテムを編集する必要があるたびに、同じ DVC インスタンスを再利用しました。

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

これが役立つことを願っています。

于 2013-04-30T15:52:38.867 に答える
-4

[self baseInit]内に呼び出します-(void)viewWillAppear:(BOOL)animatedmyImageそこに価値があるはずです。

#import "SettingItem.h"

@implementation SettingItem

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code

    }
    return self;
}

-(id) initWithCoder:(NSCoder *)aDecoder{
    self = [super initWithCoder:aDecoder];
    if (self) {
        // Initialization code

    }
    return self;
}
-(void)viewWillAppear:(BOOL)animated
{
   [self baseInit];
}

- (void) baseInit{
    NSLog(@"myImage %@"self.myImage);
}
于 2013-01-09T19:59:13.467 に答える
-6

.h ファイルで、コードを置き換える必要があります。

#import <UIKit/UIKit.h>

@interface SettingItem : UIView{

}

@property (strong, nonatomic) IBOutlet UIImageView *myImage;

@end

このコードで

#import <UIKit/UIKit.h>

@interface SettingItem : UIView{

  IBOutlet UIImageView*myImage;

}

@end

あなたは実際に myImage が何であるかを Xcode に伝えているのではなく、それを強力な非アトミック プロパティにしているだけです。

于 2012-12-30T09:02:11.930 に答える