私は非常に奇妙な問題を抱えています。なぜそれが起こっているのかはわかっていると思いますが、解決策が思いつかないようです. ここにはコンパイラのバグはないと確信しています。私はそれらの多くを持っていましたが、それらはすべて私の不完全なコードが原因で発生しました。
基本的に、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 の間のクラス階層を実際に認識できないために発生していると思います。
私が正しければ、問題を回避する方法がわかりません。しばらく考えていました。この問題を解決するのに役立つ情報をいただければ幸いです。