好的,所以在这里我有一个奇怪的问题,我在过去的几个小时里一直试图弄清楚:
我有一个简单的 iPad 故事板应用程序,有两个视图控制器,FirstViewController
一个是主视图控制器,一个ModalViewController
出现在 Modal segue 上,它有一个名为 Done 的按钮。我正在使用 ARC,并且视图控制器被指定用于 iPad。
我也有一个自定义委托UIModalViewControllerDelegate
,正如您猜想的那样,它是关闭模式并将数据传递回第一个视图控制器。
UIModalViewControllerDelegate.h
@protocol UIModalViewControllerDelegate <NSObject>
@required
-(void)btnDonePressed:(id)sender Values:(NSArray *)values;
@end
第一视图控制器.h
@interface FirstViewController : UIViewController <UIModalViewControllerDelegate> {
@private
ModalViewController *mvc;
}
@end
第一视图控制器.m
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
}
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
mvc = [segue destinationViewController];
mvc.delegate = self;
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
#pragma UIModalViewControllerDelegate
-(void)btnDonePressed:(id)sender Values:(NSArray *)values {
...
}
模态视图控制器.h
@interface ModalViewController : UIViewController {
__weak id<UIModalViewControllerDelegate> delegate;
}
@property (weak, nonatomic) id<UIModalViewControllerDelegate> delegate;
模态视图控制器.m
@implementation ModalViewController
@synthesize delegate;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(buttonPressed:)];
}
-(void) buttonPressed:(id) sender {
[delegate btnDonePressed:sender Values:values];
}
现在,有几个非常有趣的问题:
1-在准备segue中,在我设置self.mvc.delegate = self;
调试器后显示委托仍然为零(!)但是,当我使用时,NSLog(@"%@", self.mvc.delegate);
我得到了不是零的指针的地址。
2- 上面的代码不起作用,因为在ModalViewController
委托中总是为零。因此,[delegate btnDonePressed:sender Values:values];
永远不会执行。我尝试了所有我知道的可能会导致此问题的方法,但似乎没有任何效果。
3-我想对委托有一个强引用可能会解决这个问题,但我不想违反模式并导致保留周期问题。中的私有变量是否ModalViewController *mvc;
存在FirstViewController
生命周期问题?私有变量何时被取消?顺便说一句,我也尝试用它替换它,@property (strong, nonatomic) ModalViewController *mvc;
但没有任何改变。