0

好的,所以在这里我有一个奇怪的问题,我在过去的几个小时里一直试图弄清楚:

我有一个简单的 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;但没有任何改变。

4

2 回答 2

0

谢谢大家的回答。我终于找到了解决这个问题的方法。

实际上,代码是完全正确的。问题是UINavigationController,其中嵌入了模态视图控制器。

代替

myModalWindowViewController = [segue destinationViewController];
myModalWindowViewController.delegate = self;

我愿意

UINavigationController *navigationController = [segue destinationViewController];
myModalWindowViewController = (MyModalWindowViewController *)[navigationController.viewControllers objectAtIndex:0];
myModalWindowViewController.delegate = self;

我不知道当您选择嵌入在 NavigationController 中的 ViewController 时,DestinationViewController 是 NavigationController 而不是 ViewController。我的错!

于 2013-01-22T09:17:04.020 回答
0

“我只是在这里复制了错误的版本。但是,这并不能解决问题。(我更新了上面的代码)”

既然你提到了复制粘贴。确保原始代码中有一个@synthesize。这个问题看起来像是合成属性与私有变量名称不匹配。

@property (weak, nonatomic) id<UIModalViewControllerDelegate>delegate;

与 结合声明的属性@synthesize将使用名为 的私有变量delegate。如果您不小心遗漏了@synthesize一个具有名称的私有变量,_delegate则会自动创建(注意下划线)。

在您的buttonPressed:方法中,您可以直接访问私有变量delegate。所以这可能总是返回 nil 因为访问器实际上使用下划线版本。

只是为了确保,要么删除手动声明的变量,要么在您的方法中delegate使用。走着瞧吧。self.delegatebuttonPressed:

于 2013-01-18T17:34:14.557 回答