2012-07-29 41 views
0

我有一个非常奇怪的问题,我想我知道我为什么得到它,但我似乎无法想到修复。我确信这里没有编译器错误。我有很多这些,所有这些都是因为我的错误代码而发生的。我基本上有一个名为UnlockKeyboardViewController的视图控制器,它继承自UIViewController和一个名为UnlockKeyboard的自定义视图(直接从UIView继承)。对于UnlockKeyboard头看起来是这样的:“编译器错误”,“分割错误11”在自定义视图控制器上

@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.

我认为这可能与UIView没有一个名为keypadViewContainer成员的事实,虽然UnlockKeyboard具有该属性,是UIView的一个子类。我相信这是因为编译器实际上看不到UIView和UnlockKeyboard之间的类层次结构。

如果我是对的,我不知道如何解决问题。一直在想。任何输入来帮助我解决这个问题将非常感激。

+1

您正在使用您的视图控制器榫文件?如果没有,'loadView'的基本实现会将你的'UnlockKeyboardViewController'的'view'属性设置为一个常规的'UIView',否定你在'init'中做了什么(你不应该在' init')。 – omz 2012-07-29 01:59:27

+0

你说“no Xcode”;你在用什么编译器? – benzado 2012-07-29 02:00:32

+0

omz:我认为你是对的。我应该尝试在loadView中做这个任务吗?我没有使用任何笔尖或任何东西。这是纯代码,因为我没有使用XCode。我不使用XCode越狱应用程序。 benzado:仍在使用GCC。我只是没有使用XCode作为我的IDE。 – 2012-07-29 02:02:24

回答

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未在UIView(表达式self.view的类型)上定义。

类型转换被承认有点难看,但它是必要的,因为视图控制器是一个通用的父类,不知道它控制着什么样的视图。您可能会发现它有用的定义无需做演员所有的时间属性:

@property (nonatomic,readonly) UnlockKeyboard *unlockKeyboardView; 

和相应的方法:

- (UnlockKeyboard *)unlockKeyboardView 
{ 
    return self.view; 
} 
+0

也许它应该会产生警告。 Theos让我习惯于将警告视为错误,因此在得到机会给我警告之前编译器正在窃听。这就是说,我不确定这个解决方案,因为UK应该是这个控制器的主要视图(IE,我们没有给self.view分配任何东西)。无论如何,我会给它一个镜头,但其他方法(viewDidLoad等)是担心我这项工作的人。 – 2012-07-29 02:13:29

+0

Blah,也许我应该使用控制器创建一切,而不是在视图本身中创建视图的子视图...很可能会解决这个问题。 – 2012-07-29 02:21:16

+0

@Sergio我详细阐述了我的答案,希望能解决你的一些担忧。 – benzado 2012-07-29 03:13:35