当用户按下“添加”按钮时,会弹出一个模式视图供他们输入信息。我在导航栏的左上角有一个“取消”按钮,我希望它在按下时关闭当前的视图控制器。如何将对象设置为类的委托?我了解创建协议并实现其方法,但我似乎无法设置委托。在“添加”视图控制器中运行调试器时,我[self delegate]
始终是nil
.
user1349234
问问题
1022 次
3 回答
0
如果您在 IB 中创建了视图,按住 Control 键将该按钮拖动到 ViewController 的头文件中并添加一个 IBOutlet。在 .m 文件中的该方法中,您可以
[self dismissModalViewControllerAnimated:YES];
或者,您可以以编程方式创建按钮:
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(processCancel:)];
-(void)processCancel:(UIBarButtonItem *)item{
[self dismissModalViewControllerAnimated:YES];
}
于 2012-07-09T22:09:12.893 回答
0
您是否通过情节提要中设置的 segue 生成模态视图控制器?如果是这样,那么在该prepareForSegue:
方法中您将在那里设置委托。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if([identifier isEqualToString:@"userGuideSegue_home"]){
UserGuideViewController* vc = segue.destinationViewController;
[[segue destinationViewController] setDelegate:self];
}
}
另一方面,如果您完全通过代码设置模态视图控制器,那么您将创建模态视图控制器的一个实例,然后将其设置为委托。
- (void)showModelView:(NSString*)viewName
{
// code ripped out of project so a bit specific
if ([viewName isEqualToString:@"userGuide_name"]) {
modalViewController = (UserGuideViewController * )
[[UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:NULL]
instantiateViewControllerWithIdentifier:@"UserGuide"];
}
modalViewController.delegate = self;
modalViewController.modalPresentationStyle = UIModalPresentationFormSheet;
modalViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
modalViewController.view.frame = [[UIScreen mainScreen] applicationFrame];;
[self presentViewController:modalViewController
animated:YES
completion:^{
//put your code here
}];
}
当然,所有这些都假设您已经delegate
在模态视图控制器上定义了一个属性。
于 2012-07-09T22:13:43.133 回答
0
@interface MyViewController : UIViewController {
id delegate;
}
@property (nonatomic,retain) id delegate;
@synthesize delegate;
这应该可以完成这项工作,您现在可以[MyViewController setDelegate:self]
在显示模态视图之前使用并[[self delegate] dismissModalViewControllerAnimated:YES]
在取消按钮点击事件中调用MyViewController
于 2012-07-09T22:13:58.473 回答