0

我有一个拆分视图控制器,其主视图包含一个选项卡栏控制器,其四个选项卡每个都由单独的“MasterViewController”对象控制,这些对象委托给详细视图: 在此处输入图像描述

MasterViewController 类如下:

@interface MasterViewController : UIViewController <UITableViewDelegate, UITableViewDataSource, UISearchBarDelegate>

@property (strong, nonatomic) IBOutlet UISearchBar *searchBar; // Not pictured above
@property (nonatomic, strong) NSMutableArray *displayData;
@property (nonatomic, strong) NSMutableArray *auditedData;

@property (strong, nonatomic) IBOutlet UITableView *tableView; // Each of the tabs contains a tableview
@property (strong, nonatomic) IBOutlet UITextField *itemCounter;

@end

并初始化如下:

MasterViewController *blahMasterController = (MasterViewController *)tabItem;
blahController.displayData = [[NSMutableArray alloc] init];
blahController.delegate = detailTableViewController;
blahDetailController.recallDelegate = blahController;

功能是,当用户在其中一个选项卡中选择表格行时,相关数据将显示在详细视图控制器中。然后,当用户点击详细视图控制器上的按钮时,主视图选项卡中的条目将被删除。

前者效果很好……后者表现得很奇怪。这是我在 MasterViewController 中的“respondToDetailViewButton”方法(由详细控制器委托的方法):

- (void)respondToDetailViewButton
{
    NSLog(@"Class: %@: %@", [self class], self);
    NSLog(@"TableView: %@", self.displayMachinesTableView);
    NSLog(@"Search Bar:%@", self.searchBar);
}

及其输出:

类:MasterViewController:/MasterViewController:0x105b10a0/
TableView:/UITableView:0xe960c00;帧 = (0 0; 320 395); clipsToBounds = YES; 自动调整大小 = TM+BM;标签 = 1; 手势识别器 = ; 层=/CALayer:0x114b9950/;contentOffset: {0, 0}/
搜索栏: (null)

从上面你可以看到,当细节控制器委托回它的主控时,尽管对 MasterViewController 的 tableView 的引用保持不变,但 searchBar 引用尽管被强属性化,但仍变为 null。

并且 searchBar 在某些时候可验证为非零,因为在 MasterViewController 对象中,didSelectRowAtIndexPath 中的以下调用:

currentScope = [searchBar.scopeButtonTitles objectAtIndex:searchBar.selectedScopeButtonIndex];
NSLog(@"%@", currentScope);

根据我选择的范围呈现“新”或“旧”或“Blah”。

有没有人知道为什么 searchBar 引用根据我提供的内容变为空?提前谢谢了!!

4

1 回答 1

0

根据问题下的评论对话,一种可能性是不一致的变量命名可能是问题所在。看起来你可能有“@synthesize idSearchBar = searchBar;” 在您的实现中,因此 self.idSearchBar 和 searchBar 实际上是同一件事。

这样做的问题是类中其他地方的一个名为 searchBar 的局部变量可能会覆盖您的实例变量。所以试试这个:将合成行更改为“@synthesize idSearchBar = _idSearchBar;” 或完全删除 @synthesize 行并让编译器为您自动生成该行(如果使用 LLVM 编译器 4.0)。将所有显示为错误的 searchBar 用法更改为“self.idSearchBar”,以在整个班级中保持一致。searchBar 的任何剩余使用都将是不应更改的局部变量。

在那之后 - 你仍然看到问题吗?

于 2013-07-22T19:21:01.090 回答