カスタム UIView オブジェクトにカスタム タブ バー コントローラーであるデリゲートを設定しようとしているという奇妙な問題があります。タブバーコントローラーはデリゲートとして設定されていますが、それは nil ではなく、実際には設定されていると確信しています! ただし、後でカスタム UIView がそのタスクを実行すると、デリゲートは nil になります。
私はARCを使用しており、問題のタブバーがUINavBar内にあるにもかかわらず、オブジェクトが強いことを確認したので、解放されるべきではありません...
UITabBar が実際に解放される方法はないと考え始めています。これは明らかにまだ存在しているためです...また、適切な方法でデリゲートとして設定していると確信しています。
UITabViewController が保持する ViewController の 1 つの ViewDidLoad 内にデリゲートを設定します。デリゲートを設定する方法は次のとおりです。
- (void)viewDidLoad
{
[super viewDidLoad];
customSearchBar.delegate = (id<SearchResultReceiver>)self.tabBarController;
//customSearchBar.delegate IS SET, btw tabBarController implements SearchResultReceiver
...
}
私が言ったように、id デリゲートは、強い必要があるとは思いませんが、プロパティ (strong、nonatomic) を持っています。TabBarController はすでに NavigationBarController によって別の場所に所有されているため、弱いはずですが、この問題を見たときに安全を確保したかったのです。
これはデリゲートが nil のコードです。今は CustomSearchBar.m です。それが重要かどうかはわかりませんが、ご想像のとおりですが... CustomSearchBar.m は UITextFieldDelegate です。
次のコードは、URL 要求を処理し、着信/発信 json を辞書に変換する Communicator オブジェクトによって呼び出され、正常に動作しています。以下が -(void)connectionDidFinishLoading:(NSURLConnection *)connection... によって呼び出されるふりをしてください...
-(void)receiveData:(NSDictionary *)dict forMode:(int)mode
{
[self.delegate receiveSearchResult:dict];
[spinner stopAnimating];
[searchConnection cancel];
}
現在、デリゲートは nil です。コードの他の場所では、customSearchBar のデリゲートを要求しません。
追加情報:
CustomSearchBar は UIView を拡張し、それを所有する ViewController への IBOutlet です。その ViewController は、デリゲートとして設定しようとしている TabBarController によって所有されています。
お時間をいただきありがとうございます。詳細をお知らせできる場合はお知らせください。問題が発生する理由がわからない場合、プレゼンテーションが不十分になります:'( sarry!
デリゲートの合成に関する詳細情報は次のとおりです...
#import <UIKit/UIKit.h>
#import "Communicator.h"
@protocol SearchResultReceiver <NSObject>
@optional
-(void) receiveSearchResult:(NSDictionary *) dict;
@end
@interface CustomSearchBar : UIView <UITextFieldDelegate, DataReceiver>
{
__strong id <SearchResultReceiver> delegate;
}
@property (strong, nonatomic) id<SearchResultReceiver> delegate;
...
.mi では @synthesize デリゲートを実行します。単に