我(想)我已经在Apple的文档和网络上广泛研究过这个问题,无论是在这里还是其他地方。然而,经过几个小时的故障排除后,我没有想法。我的模态视图控制器拒绝在适当的时候解散自己。
我知道模态控制器必须由呈现模态视图的控制器解除,据我所知,这就是我正在做的事情。
问题:
这是prepareForSegue中包含的用于呈现viewcontroller的代码,完整地:
if ([segue.identifier isEqualToString:@"DISCREPANCYVC"]) {
DiscrepancyViewController *destController = segue.destinationViewController;
destController.discrepancyDelegate = self;
}
模态控制器包含两个行为正常的UIPickerViews。选择器视图用于构造“classificationString”,即NSString。
我在模态视图上有一个“完成”按钮,当按下该按钮时,会调用此方法/选择器(根据我设置的协议定义):
[self.DiscrepancyDelegate didFinishWithClassification:classificationString];
didFinishWithClassification方法如下所示:
- (void)didFinishWithClassification:(NSString *)classification {
[self dismissModalViewControllerAnimated:NO];
如果重要,协议定义为
@protocol DiscrepancyViewControllerDelegate <NSObject>
@required
- (void)didFinishWithClassification:(NSString *)aClassification;
@end
将引用保存回呈现视图的属性显示为:
@property (strong, nonatomic) id <DiscrepancyViewControllerDelegate> DiscrepancyDelegate;
还有四个额外的属性(强大的,非原子的)用于存放填充UIPickerViews的四个数组(每个选择器有两个组件)。
我尝试了动画和非动画解雇,但没有改变行为。
可能导致这种情况的原因是什么?我正在使用ARC,所以在尝试转储模态屏幕之前不能释放任何东西,对吗?从我读过的内容来看,viewDidUnload()不一定会在这种情况下触发(并且在我的情况下不会触发)。
帮助!!
THX,
泰德
答案 0 :(得分:0)
使委托协议工作需要9个步骤。在我的回答here中查看所有内容。
此外,声明:“我知道模态控制器必须由呈现模态视图的控制器解除”是不正确的。它被建议为良好的形式,但是您可以将dismiss语句放在模态视图控制器中,如果您没有其他理由拥有委托,那么我会这样做而不是忍受设置委托协议的复杂性。
答案 1 :(得分:0)
我明白了;有点。我必须错误地连接Outlet,或者某种重复的连接,因为在删除了按钮和控制器,拣选器和控制器之间的所有连接,然后重置它们之后,它开始工作。我不知道我做了什么(现在让我发疯了)但这不是编码问题。
建议:用细齿梳子连接。他们可以掩盖问题,而不会将自己视为错误。
Grrrrrrr。