簡體   English   中英

在Objective-C中作為外部類委派

[英]Delegate as external class in Objective-C

我正在使用Xcode和Interface Builder為iPhone創建一個簡單的項目。 雖然我理解委托是什么,但我在使用它時遇到了問題。

我的界面中有一個UITextField。 當用戶點擊鍵盤時它會顯示鍵盤,但我需要手動編程如何隱藏鍵盤。 可以使用代表完成。 所以在IB中,我從庫中獲取Object,將其類名稱作為Control1Delegate,然后將我的textfield中的委托出口連接為此Control1Delegate。 我還有這個Control1Delegate類的.m和.h文件:

Control1Delegate.h

@interface Control1Delegate : NSObject <UITextFieldDelegate> {
}

- (BOOL) textFieldShouldReturn:(UITextField *)textField;

@end

Control1Delegate.m

#import "Control1Delegate.h"

@implementation Control1Delegate

- (BOOL) textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return YES;
}

@end

但這不起作用。 運行時,它永遠不會到達textFieldShouldReturn方法或沒有msg或EXEC_BAD_ACCESS崩潰。 有趣的是,當我將方法移動到控制器文件(一個向導生成)並從UITextField連接到此控制器(文件的所有者)時,一切都按預期工作。 我看到大多數蘋果代碼教程將委托方法放入隨機對象而不是單獨的類 - 我想知道原因。 我不能在單獨的課上有代表嗎?

我在這里缺少什么? 一些空指針? 對象生命周期?

您的Control1Delegate對象在創建后很快就會被銷毀。 如果要保持活動狀態,則必須保留所有頂級Nib對象。 請參閱資源編程指南:Nib對象生命周期

文件所有者可以擁有這樣的屬性,以保留對象:

@property (nonatomic, retain) IBOutlet Control1Delegate *control1delegate;

請記住在不再需要后釋放該對象。

您可以將委托方法放在任何類中,包括僅為此目的而構建的方法。 Apple(和其他程序員)通常不專門為委托函數創建類的原因是它變得過於復雜並且難以共享數據。 例如,在我的一個項目中,我可能會創建一個Window Controller子類,用於處理窗口中的委托方法,窗口內的表視圖以及窗口的工具欄。 操作和維護該窗口狀態所需的一切都在一個控制器類中。 現在想象一下三個獨立的類(加上可能是一個管理它們的控制器類)執行相同的功能 - 這是很多額外的工作,沒有真正的好處。

至於為什么它會崩潰,聽起來你在應用程序的其他地方的內存管理上犯了一個錯誤。 您可以使用調試器准確地跟蹤它的來源。

謝謝你倆。 我現在不僅知道如何解決我的問題,而且最終了解了如何在Nib創建過程中保留對象。 在IB中創建對象是不夠的,如果它是一個新實體,它必須連接到文件所有者中的真實ivar(具有適當合成的getter / setter)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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