Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/116.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在模态ViewController被解除时作出反应_Ios_Objective C_Uiviewcontroller_Uinavigationcontroller_Delegates - Fatal编程技术网

Ios 在模态ViewController被解除时作出反应

Ios 在模态ViewController被解除时作出反应,ios,objective-c,uiviewcontroller,uinavigationcontroller,delegates,Ios,Objective C,Uiviewcontroller,Uinavigationcontroller,Delegates,我有三个视图控制器和一个导航控制器。导航堆栈为: 导航控制器推送->VC1推送->VC2。VC1可以以代码的形式呈现VC3。其未通过segues连接。 VC1-“您当前的项目” VC2-“您项目的详细信息” VC3-“创建新项目” 当用户希望创建一个新项目时,我使用以下方法放置一个VC3: - (IBAction)newProjectButton:(id)sender { NewProjectViewController *newProject = [[NewProjectViewCon

我有三个视图控制器和一个导航控制器。导航堆栈为:
导航控制器推送->VC1推送->VC2。VC1可以以代码的形式呈现VC3。其未通过segues连接。
VC1-“您当前的项目”
VC2-“您项目的详细信息”
VC3-“创建新项目”

当用户希望创建一个新项目时,我使用以下方法放置一个VC3:

- (IBAction)newProjectButton:(id)sender {
    NewProjectViewController *newProject = [[NewProjectViewController alloc] init];
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:newProject];
    [self presentViewController:navController animated:YES completion:nil];
}
如果用户按下“取消”按钮,我将使用以下代码:

- (IBAction)cancelButton:(id)sender {
    [self dismissViewControllerAnimated:YES completion:nil];
}
当用户按下“完成”按钮时,我希望VC1切换到VC2并显示新项目的属性。我希望此序列对用户不可见,因此,他只看到以下事件链:
按下按钮“添加”->模态VC出现->按下“完成”->模态VC消失,VC3已显示


我要问的是如何告诉VC1用户按下了“完成”按钮?这里可以授权吗?如何实施?谢谢。

您应该创建一个委托协议,该协议允许模态视图控制器向其创建者发送通知

@protocol ModalViewControllerDelegate
@optional
- (void)modalViewControllerDidCancel:(ModalViewController *)vc;
- (BOOL)modalViewControllerShouldSave:(ModalViewController *)vc;
@end
然后,在
ModalViewController
中定义一个新属性。
很重要,因为您不希望有任何保留周期

@property (nonatomic, weak) id <ModalViewControllerDelegate> delegate;
@属性(非原子,弱)id委托;

在解除或保存之前,只需检查委托是否实现了这些方法(通过
-respondsToSelector:
)并发送相应的回调。在创建模态视图控制器时,不要忘记设置delegate属性。

是的,委派是一种方法。请查看我的答案以了解详细信息。谢谢!我说的对吗,我需要在VC1中实现您的第一个代码段?不。协议应该在a)它自己的文件中实现,您可以在
ModalViewController.h
中导入,或者直接在
ModalViewController.h
中导入。我推荐a)tho。您不想在VC1中声明协议的原因是因为1。模态视图控制器必须有权访问它和2。它实际上是模态视图控制器的一部分,可能在其他地方使用,而不需要VC1。我误解了你的意思。那么,为什么将它添加到自己的文件中比直接添加到ModalVC更好呢?我真的不在乎。我只是喜欢把事情分开。