2012-07-29 39 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