我有一个奇怪的问题,我试图将自定义 UIView 对象设置为具有一个委托,该委托是一个自定义选项卡栏控制器。选项卡栏控制器被设置为代表,我很肯定它不是零,而且它实际上已设置!但是稍后当自定义 UIView 执行其任务时,委托为零。
我正在使用 ARC,并且我确保该对象很强大,即使有问题的标签栏位于 UINavBar 内,所以它不应该被释放......
我开始认为 UITabBar 不可能真正被释放,因为它显然仍然存在......我也很确定我正在以适当的方式将它设置为委托。
我将委托设置在 UITabViewController 持有的 ViewController 之一的 ViewDidLoad 中。这是我设置委托的方式:
- (void)viewDidLoad
{
[super viewDidLoad];
customSearchBar.delegate = (id<SearchResultReceiver>)self.tabBarController;
//customSearchBar.delegate IS SET, btw tabBarController implements SearchResultReceiver
...
}
正如我所说,id 委托具有属性(强的、非原子的),即使我不认为它必须是强的。似乎它应该很弱,因为 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];
}
现在代表为零。我在代码中的其他任何地方都没有要求 customSearchBar 的委托。
附加信息:
CustomSearchBar 扩展 UIView 并且是拥有它的 ViewController 的 IBOutlet。该 ViewController 归我试图设置为委托的 TabBarController 所有。
感谢您的宝贵时间,如果我可以提供更多详细信息,请告诉我。不知道为什么会出现问题会导致表现不佳:'( 抱歉!
以下是有关委托合成的更多信息...
#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 委托;简单地