簡體   English   中英

創建 UIButton 時,iPhone 應用程序在 loadView 方法中崩潰

[英]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中。 初始化代碼可以創建無限堆棧跟蹤。 雖然我不確定創建該按鈕是否會觸發崩潰。

如果我錯了,任何人都可以糾正我

看到這個: iPhone SDK:loadView 和 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM