从拆分视图控制器中的详细视图进行回调委派后,主视图中的强属性属性变为空

Posted

技术标签:

【中文标题】从拆分视图控制器中的详细视图进行回调委派后,主视图中的强属性属性变为空【英文标题】:Strongly Attributed Property in Master View Becomes Null After Callback Delegation from Detail View in Split View Controller 【发布时间】:2013-07-22 18:10:02 【问题描述】:

我有一个拆分视图控制器,其主视图包含一个选项卡栏控制器,其四个选项卡每个都由单独的“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/ 表视图:/UITableView:0xe960c00;帧 = (0 0; 320 395); clipsToBounds = YES;自动调整大小 = TM+BM;标签 = 1;手势识别器 = ;层=/CALayer:0x114b9950/;内容偏移: 0, 0/ 搜索栏:(null)

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

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

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

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

根据我提供的内容,是否有人知道为什么 searchBar 引用变为空?非常感谢提前!

【问题讨论】:

我不确定还有什么可以帮助添加的,因为帖子已经很长了。请询问您认为可以帮助您诊断我遇到的问题的更多详细信息。谢谢! idSearchBar 属性是否非零?仅仅因为它显示在 UI 中并不意味着 IBOutlet 被连接到有一个指向 UISearchBar 对象的指针 感谢您的回复!我已经更新了我的问题,以验证 searchBar 并不总是 nil 这并不能证明 self.idSearchBar 不为零。在您的示例中,您使用“searchBar”,我假设它是一个局部变量。该局部变量是如何初始化的? 它的@synthesized 来自头文件。 (在我的项目中,它被称为 idSearchBar;我试图使其尽可能通用,并从该问题的名称中删除 'id' 部分,但没有及时将其编辑出来。抱歉造成混淆) 【参考方案1】:

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

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

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

【讨论】:

我的课堂上没有“searchBar”之类的东西。我不小心复制了“idSearchBar”并忘记删除我的问题中的 id 前缀(为了一般性)而使您感到困惑。都是“idSearchBar”,是合成的结果。我的 class.m 中对 idSearchBar 的所有引用如下:@synthesize idSearchBar idCurrentScope = [idSearchBar.scopeButtonTitles objectAtIndex:idSearchBar.selectedScopeButtonIndex]; [self filterContentForIDSearchText:idSearchBar.text]; 字面意思就是这样;它不是局部变量 - 它直接来自 .h 属性中引用的情节提要 我不知道如何在 cmets 中放置换行符;无论如何,我希望你能读到它.. :S 我能想到的唯一一件事就是你能不能把整个班级都贴出来。那里的点点滴滴,还有一些变量名错误,使得诊断任何问题变得困难。

以上是关于从拆分视图控制器中的详细视图进行回调委派后,主视图中的强属性属性变为空的主要内容,如果未能解决你的问题,请参考以下文章

从容器视图中的选项卡栏控制器中的视图控制器委派信息

iOS - 拆分视图控制器 - 如何从主视图控制器内部获取指向详细视图控制器的指针(引用)?

拆分视图中的集合视图控制器不更新

iPad拆分视图,uisplitview中的多个主视图和详细视图

在拆分视图控制器的详细视图中制作导航控制器

在 iOS 拆分视图控制器上推送新的视图控制器