0

私は非常に奇妙な問題を抱えています。なぜそれが起こっているのかはわかっていると思いますが、解決策が思いつかないようです. ここにはコンパイラのバグはないと確信しています。私はそれらの多くを持っていましたが、それらはすべて私の不完全なコードが原因で発生しました。

基本的に、UIViewController から継承する UnlockKeyboardViewController というビュー コントローラーと、UnlockKeyboard というカスタム ビュー (UIView から直接継承) があります。UnlockKeyboard のヘッダーは次のようになります。

@interface UnlockKeyboard : UIView
{
    NSArray *buttons;
    NSArray *passcodeFields;

    UIImage *buttonBackgroundImage;
    UIImage *buttonBackgroundHighlightedImage;
    UIImage *middleButtonBackgroundImage;
    UIImage *middleButtonBackgroundImageHighlighted;
    UIImage *screenBackgroundImage;

    UIImage *infoViewContainerImage;
    UIImage *keypadViewContainerImage;
    UIImage *passcodeFieldsContainerImage;

    UIImage *infoViewImage;
    UIImage *passcodeViewImage;

    UIView *infoViewContainer;
    UIView *keypadViewContainer;
    UIView *passcodeFieldsContainer;

    UIView *infoView;
    UIView *keypadView;
    UIView *passcodeFieldsView;

    UIView *infoToDisplayView; //The view the programmer passes to show in infoView.
}
@property(nonatomic, retain)UIImage *buttonBackgroundImage;
@property(nonatomic, retain)UIImage *buttonBackgroundHighlightedImage;
@property(nonatomic, retain)UIImage *screenBackgroundImage;
@property(nonatomic, retain)UIImage *keypadViewBackgroundImage;
@property(nonatomic, retain)UIImage *infoViewContainerImage;
@property(nonatomic, retain)UIImage *keypadViewContainerImage;
@property(nonatomic, retain)UIImage *passcodeFieldsContainerImage;
@property(nonatomic, retain)UIImage *infoViewImage;
@property(nonatomic, retain)UIImage *passcodeViewImage;
@property(nonatomic, retain)UIView *infoToDisplayView;

//Properties for container views.
@property(nonatomic, retain)UIView *infoViewContainer;
@property(nonatomic, retain)UIView *keypadViewContainer;
@property(nonatomic, retain)UIView *passcodeFieldsContainer;

@end

UnlockKeyboardViewController の実装は、これまでのところ次のようになっています。

@implementation UnlockKeyboardViewController
-(id)init
{
    if((self = [super init]))
    {
        self.view = [[UnlockKeyboard alloc] init];
    }
    return self;
}

-(void)viewDidLoad
{
    [super viewDidLoad];
}

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [UIView animateWithDuration:0.7 animations:^{
        self.view.keypadViewContainer.frame = CGRectMake(0, 261, 320, 200);
    } completion:^(BOOL finished){

    }];
}

-(void)dealloc
{
    [super dealloc];
}
@end

これは私の問題が面白くなったということです。コンパイルしようとすると、ターミナル (これは脱獄アプリなので、Xcode はありません) で次のエラーが表示されます。

In function ‘void __-[UnlockKeyboardViewController viewDidAppear:]_block_invoke_1(void*)’:
Segmentation fault: 11
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://developer.apple.com/bugreporter> for instructions.

しかし、このエラーは、次の行がある場合にのみ表示されます。

self.view.keypadViewContainer.frame = CGRectMake(0, 261, 320, 200);

アニメーション ブロックでその行を指定しないと、コンパイラはエラーを表示せず、問題なくコンパイルされます。ただし、この行を入力しても、常にセグメンテーション行 11 が表示されます。

UnlockKeyboard にはそのプロパティがあり、UIView のサブクラスですが、これは UIView に keypadViewContainer というメンバーがないという事実と関係があると思います。これは、コンパイラが UIView と UnlockKeyboard の間のクラス階層を実際に認識できないために発生していると思います。

私が正しければ、問題を回避する方法がわかりません。しばらく考えていました。この問題を解決するのに役立つ情報をいただければ幸いです。

4

1 に答える 1

0

まず、ビュー コントローラーのビュー プロパティのみをそのloadViewメソッドに設定する必要があります。

- (void)loadView
{
    self.view = [[UnlockKeyboard alloc] init];
}

viewDidLoadこれにより、オブジェクトが完全に初期化されていることを期待するなどの他のメソッドがトリガーされます。教訓:viewコントローラーから要求されるまで、プロパティを設定しないでください。

次に、viewDidAppear:メソッドで、viewプロパティを使用している特定のサブクラスにケース化すると、警告が回避され、奇妙なコンパイラのクラッシュも回避されるはずです。

[UIView animateWithDuration:0.7 animations:^{
    UnlockKeyboard *ukView = (UnlockKeyboard *)self.view;
    ukView.keypadViewContainer.frame = CGRectMake(0, 261, 320, 200);

プロパティが(式の型) でkeypadViewContainer定義されていないため、記述したコードはコンパイラの警告をトリガーする必要があります。UIViewself.view

型キャストは確かに少し醜いですが、View Controller は一般的な親クラスであり、制御しているビューの種類がわからないため必要です。常にキャストを行う必要をなくすプロパティを定義すると便利な場合があります。

@property (nonatomic,readonly) UnlockKeyboard *unlockKeyboardView;

そして対応する方法:

- (UnlockKeyboard *)unlockKeyboardView
{
    return self.view;
}
于 2012-07-29T02:06:40.053 に答える