-1

我有一个奇怪的问题,我试图将自定义 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 委托;简单地

4

1 回答 1

0

我已经想通了!

这是一个令人沮丧的问题,但我不小心将两个 UIViews 放入了 CustomSearchBars,我将委托设置在其中一个中,而另一个是活动的:它仍然未设置。

我觉得很愚蠢。

于 2012-08-26T23:57:54.200 回答