[英]iPhone App crashing in loadView method when creating a UIButton
為什么每當加載此視圖時,以下內容會使我的應用程序崩潰?
-(void)loadView {
UIButton *chooseSubjectButton = [[UIButton buttonWithType:UIButtonTypeDetailDisclosure] retain];
[chooseSubjectButton addTarget:self action:@selector(chooseSubject) forControlEvents:UIControlEventTouchUpInside ];
chooseSubjectButton.frame = CGRectMake(15.0f, 205.0f, 296.0f, 51.0f);
[self.view addSubview:chooseSubjectButton];
}
任何幫助將不勝感激。
謝謝!
我的猜測是,您的應用實際上並沒有崩潰。 它只是不斷地重復調用loadView
方法,因為您錯過了加載視圖。 在向self.view添加任何內容之前,調用[super loadView]
或創建一個視圖並將其分配為self.view
。 方便的方法是使用[super loadView]
。
- (void)loadView {
[super loadView];
// Your Code Here
}
編輯:這個答案看起來是錯誤的。 請考慮訪問是否可以調用 [super loadView]? 正如@Denis Vert 在評論中指出的那樣。
@Simon 指出您缺少[super loadView]
提示另一個問題。
您是否使用關聯的.xib 文件加載此視圖控制器? 如果是這樣,您可能意味着在-viewDidLoad
而不是-viewLoad
中執行此操作。
只是一個想法,因為我過去一直對此感到困惑。
好的,這里已經給出的答案有很多混亂......
首先,您不調用[super loadView];
,請參閱- (void)loadView
:
如果您重寫此方法以手動創建視圖,您應該這樣做並將層次結構的根視圖分配給視圖屬性。 (您創建的視圖應該是唯一的實例,並且不應與任何其他視圖共享 controller object。)此方法的自定義實現不應調用 super。
如果您真的打算使用loadView
(即以編程方式創建視圖,而不是從 NIB),那么在您的實現中,您必須分配 controller 的view
屬性。
此外,您不需要按照使用按鈕的方式保留按鈕,因為您將其添加為主視圖的子視圖(之后您的主視圖將擁有它)。
基於這些考慮,您的方法將如下所示:
-(void)loadView {
CGRect frame = [[UIScreen mainScreen] applicationFrame]; // adjust to your needs
UIView *rootView = [[UIView alloc] initWithFrame:frame];
UIButton *chooseSubjectButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
chooseSubjectButton.frame = CGRectMake(15.0f, 205.0f, 296.0f, 51.0f);
[chooseSubjectButton addTarget:self action:@selector(chooseSubject) forControlEvents:UIControlEventTouchUpInside];
[rootView addSubview:chooseSubjectButton];
self.view = rootView;
[rootView release];
}
當然,如果你使用 NIB 來定義你的根視圖,你需要重寫-viewDidLoad:
來進行額外的配置。
希望這可以幫助。
你得到一個無限循環,因為你在 loadView 中引用 self.view。 當你調用 self.view,而 self.view 為 nil 時,會導致 loadView 再次被調用。 創建循環。
如果你調用 [super loadView] 它將初始化 self.view 所以你看不到問題。
所以,實例化 self.view 自己,你會沒事的。
希望這可以幫助。
嘗試將該代碼放在viewDidLoad
中。 初始化代碼可以創建無限堆棧跟蹤。 雖然我不確定創建該按鈕是否會觸發崩潰。
如果我錯了,任何人都可以糾正我
-(void)loadView { [super loadView]; UIButton *chooseSubjectButton = [[UIButton buttonWithType:UIButtonTypeDetailDisclosure] retain]; [chooseSubjectButton addTarget:self action:@selector(chooseSubject) forControlEvents:UIControlEventTouchUpInside ]; chooseSubjectButton.frame = CGRectMake(15.0f, 205.0f, 296.0f, 51.0f); [self.view addSubview:chooseSubjectButton]; }
希望這可以幫助
只是對於其他閱讀此線程的人來說,Octy 說你永遠不應該調用 [super loadView] 是正確的。 我在這個頁面上讀過一些關於它的辯論。 閱讀 Octy 回答中發布的文檔,第 28 頁清楚地指出您不應該調用此方法。 甚至解釋了原因。 這樣做將使用默認名稱(與類名相同)查找 nib。 即使這個筆尖不存在,也是對處理能力的浪費。 只需創建一個新的 UIView 並將其設置為 self.view。 (參見本頁示例)
只是想確保未來的讀者知道這一點。 我花了一段時間才弄清楚。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.