4

これはこの質問( IB /Xcode4.5.1およびiOSSimulator6.0でのカスタムUIViewハウツー)のフォローアップですが、読む必要はありません-これはカスタムUIViewを作成するのは初めてであり、明らかに何かがあります私はあなたが提供できるどんな助けに対しても前もってそれほどthxを得ていません。

InterfaceBuilderから派生したカスタムUIViewがあります。サイズを200wx200hに設定し、backgroundColorを緑に設定したいと思います。私が作成したとき、私は次のことをしました:

  1. [ファイル]->[新規]->[Objective-C]を介してTviewと呼ばれる新しいカスタムUIViewを作成しました
  2. [ファイル]->[新規]->[ユーザーインターフェイス]->[ビュー]を使用して新しいビューを作成し、tnibと呼びました。
  3. キャンバスで、ビューを削除し、オブジェクトインスペクターから新しいビューを追加して、クラス名をTviewに設定しました。また、属性インスペクターで、サイズをフリーフォームに設定し、背景色を緑に設定しました。サイズインスペクターで、幅を200に、高さを200に設定しました。

私のTview.mでは、次のように設定しました(他のSOの質問に基づいていくつかの更新を行いましたが、それらがまだ最新であるか正確であるかは不明です)。

@implementation Tview

-(id) initWithCoder:(NSCoder *)aDecoder
{
  NSLog(@"in initWithCoder");
  if((self = [super initWithCoder:aDecoder])) {
    [self setUpView];
    }
  return self;
}

-(void)awakeFromNib
{
  NSLog(@"in awakeFromNib");
  [self setUpView];
}

-(void)setUpView
{
    NSLog(@"I am in setUpView");
    NSArray *subviewArray=[[NSBundle mainBundle] loadNibNamed:@"tnib" owner:self options:nil];
    UIView *mainView = [subviewArray objectAtIndex:0];
    [self addSubview:mainView];
}

@end

ViewController.xibで、UIViewをドラッグして、カスタムクラス名をTviewに設定します。Tview.hファイルを#importし、ViewController.xibからTview.hにドラッグして、次のプロパティを作成します。

@property (strong, nonatomic) IBOutlet Tview *myTview;

私はビルドして実行し、次の無限ループを取得します。

2013-03-04 06:49:05.452 Nibtest2[44524:11303] in initWithCoder
2013-03-04 06:49:05.455 Nibtest2[44524:11303] I am in setUpView
2013-03-04 06:49:05.456 Nibtest2[44524:11303] in initWithCoder
2013-03-04 06:49:05.458 Nibtest2[44524:11303] I am in setUpView
2013-03-04 06:49:05.459 Nibtest2[44524:11303] in initWithCoder
2013-03-04 06:49:05.460 Nibtest2[44524:11303] I am in setUpView

最終的にクラッシュするまで。

私はここで何が間違っているのですか?

事前にt​​hx

4

2 に答える 2

4

コードは無限再帰を設定します。initWithCoder:呼び出しは、バンドルからsetUpView新しいものをインスタンス化し、間接的に呼び出して、サイクルを完了します。UIViewinitWithCoder:

同じNIBが読み取られたときに呼び出されるコードでNIBにアクセスしないでください。TviewNIBは、オブジェクト自体のコードではなく、含まれているオブジェクトのコードで読み取る必要があります。そうしないと、無限のサイクルが発生します。

およびsetUpViewからの呼び出しとともに、完全にリモートする必要があります。の呼び出しによって証明されるように、オブジェクトインスペクターからドラッグアウトすることによってInterface Builderで確立した接続により、NIBファイルがすでに正しくロードされているようです。あなたが必要とするかもしれない唯一の行はこれです:awakeFromNibinitWithCoder:initWithCoder:

[self addSubview:mainView];

ただし、Tviewのコードには含めないでください。myTviewプロパティを持つ親コントローラーに移動する必要があり、次のように変更する必要があります。

[self.view addSubview:_myTview];

この行をに追加しviewDidLoadます。それは問題の世話をする必要があります。

于 2013-03-04T15:31:56.197 に答える
0

実際、この問題に対する私の解決策は、次のようなビューを使用したいCustonViewControllerのviewDidLoadにビューをロードすることでした。

myAccessoryView = NSBundle.mainBundle().loadNibNamed("MyAccessoryView", owner: self, options: nil)[0] as! MyAccessoryView

メソッドにビューをロードしないでくださいloadView()!loadViewメソッドは、カスタムViewControllerのビューをロードするために使用されます。

于 2016-02-05T09:36:27.127 に答える