2012-02-06 16 views
2

最新のSDKとXCode 4.2でiOSアプリケーションを開発しています。カスタムXIBを使用したカスタムUIView:IBOutletsが機能しない

カスタムUIViewでカスタムXIBを使用したいと考えています。

マイカスタムUIViewの:

@interface CoordinateView : UIView { 
    /** 
    */ 
    ARGeoCoordinate *geoCoordinate; 
    /** 
    */ 
    IBOutlet UILabel* title; 
    /** 
    */ 
    IBOutlet UILabel* subTitle; 
    /** 
    */ 
    IBOutlet UIImageView* image; 
} 

が実装:

@implementation CoordinateView 

@synthesize geoCoordinate; 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) 
    { 
     // Initialization code. 
     // 
     NSArray* topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CoordinateView" owner:nil options:nil]; 
     for(id currentObject in topLevelObjects) 
     { 
      if ([currentObject isKindOfClass:[CoordinateView class]]) 
      { 
       [self addSubview:currentObject]; 
       break; 
      } 
     } 
    } 
    return self; 
} 

- (id)initForCoordinate:(ARGeoCoordinate *)coordinate 
{ 
    self.geoCoordinate = coordinate; 
    CGRect theFrame = CGRectMake(0, 0, BOX_WIDTH, BOX_HEIGHT); 

    self = [self initWithFrame:theFrame]; 
    if (self) 
    { 
     title.text = geoCoordinate.title; 
     image.image = [UIImage imageNamed:[NSString stringWithFormat:@"03%d.jpg", geoCoordinate.id]]; 
    } 
    return self; 
} 

私はinitWithCoordinateメソッドを使用CoordinateViewを初期化します。

title.text = geoCoordinate.title; 

私は 'リンク' IBOutletsにInterface Builderのを使用しました:

デバッグ私はtitleがここinitWithCoordinate内部nilであることを発見しました。

私は間違っていますか?

答えて

2

同じ問題が発生しました。ここで私はそれを修正するために何をしましたか:

  1. xibで、ドキュメントのアウトライン(ビューの一覧とそのサブビューなどを表示する左ペイン)を開きます。
  2. 左のコントロールあなたのクラスを表すビュー(あなたの場合はCoordinateView)をクリックし、青い線をサブビューにドラッグします(あなたの場合はタイトルと呼ばれるUILabel)
  3. XCodeは小さなダイアログボックスを表示します。オプション "title"(あなたのラベルはタイトルと呼ばれるため)
  4. タイトルとwallaaをクリックします。
  5. デバッグに戻り、コンセントがまだnilかどうかを確認します。

私は誰かにNSStringを返すように[objectInstance title]が表示されるため、私はあなたのUILabel 'titleLabel'を 'title'の代わりに呼び出します'title'がUILabelであることを知らないただ個人的な好み、thats all。

乾杯いいですね。

+0

問題はXCode 9とiOS 11ではまだ存在しますが、手順3のダイアログボックスでは表示されません。あなたはあなたの答えを更新していただけますか? – iOSdev

-2

ビューが完全にロードされると、viewDidLoadメソッドが呼び出されます。したがって、ビュー内の要素を初期化する必要があります。

- (void)viewDidLoad { 
    title.text = self.geoCoordinate.title; 
} 

さらに詳しい情報はdocsにあります。

+2

viewDidLoadはUIViewControllerメソッドです。私はUIViewControllerを使用していません。 – VansFannel

+0

UIViewControllerなしでxibファイルをどのように読み込みましたか? –

+0

@Rollin_s私の質問を見て、コードはそこにあります。 – VansFannel

1

initWithFrame:メソッドでは、サブビューとして追加する代わりにselfcurrentObjectに割り当てる必要があります。

ビューのレイアウトがxibファイルによって決まるので、initWithFrame:を無効にしてsuperメソッドを呼び出す必要はありません。

+0

私のプロジェクトでは、UIViewサブクラス(NSMutableArrayをMyCustomViewと呼ぶことができます)のプロパティとしてNSMutableArrayを追加しなければならない時が来るまで、あなたが示唆していることをすべて行いました。 MyCustomViewのinitメソッドで配列を割り当て、初期化しました。しかし、何とかアプリが動いている間、配列は不思議にも無限になります。私はiVarとして追加しようとしましたが、同じ問題が残っていました。私はグーグルで、loadNibNamedでロードされたビューをself(自分自身がMyCustomViewのインスタンス)に追加する方法を見つけました。それは何とか働いた。私が間違っていたことに関するアイデアは? – pnizzle