2012-01-15 53 views
0

当完成按钮应用程序的点击崩溃并给出程序收到信号SIGABRT的消息时。在解除来自UINavigation Controller的modalviewcontroller的问题完成按钮

在ModalViewController.h委派协议和方法

@protocol ModalViewDelegate <NSObject> 

-(void) dismissModalView:(UIViewController *) viewController; 

@end 

@interface Infoviewcontroller : UIViewController <ModalViewDelegate> 

{ 
    id<ModalViewDelegate> dismissDelegate; 
} 

@property (nonatomic, retain) id<ModalViewDelegate> dismissDelegate; 

@end 

在modalviewcontroller。米文件

@synthesize dismissDelegate; 

-(void) dismissModalView:(UIViewController *) viewController; 
{ 

    [self dismissModalViewControllerAnimated:YES]; 

} 
@end 

在完成按钮定义

UIButton* backButton = [UIButton buttonWithType:101]; 
[backButton addTarget:self action:@selector(dismissView:) forControlEvents:UIControlEventTouchUpInside]; 
[backButton setTitle:@"Done" forState:UIControlStateNormal]; 

// create button item 
UIBarButtonItem* backItem = [[UIBarButtonItem alloc] initWithCustomView:backButton]; 

// add the button to navigation bar 
self.navigationItem.leftBarButtonItem = backItem; 
[backItem release]; 


-(void) dismissView: (id)sender 

{ 
    [UIViewController dismissDelegate]; 
} 

当完成按钮的应用程序崩溃的点击次数和给出节目接收信号SIGABRT消息。所以我认为我做错了dismissView完成按钮的方法,这就是为什么它给出的消息,UIViewController dismissDelegate无法识别的选择器

帮助将不胜感激。

感谢

回答

3

你调用的UIViewController一个类的方法不存在(dismissDelegate - 您已定义为Infoviewcontroller的属性)。

我觉得你与使用ModalViewDelegate的有些困惑,让我试着解释...

在苹果视图控制器编程指南,该建议是:将呈现模态控制器的视图控制器是负责解雇它。因此,您需要一种模式控制器与演示控制器通话的方式。

所以...您的展示控制器应符合您的ModalViewDelegate协议(不是您的模态控制器,因为您在这里)。

当您呈现模态视图控制器时,您将其委托设置为self(自身是呈现视图控制器)。然后

你dismissView方法应该是:

-(void) dismissView: (id)sender 
{ 
    [self.dismissDelegate dismissModalView:self]; 
} 

其实,你可能甚至不需要到UIViewController的参数传递给委托,你会不会落得使用它。

最后,你的dismissDelegate属性真的不应该保留,它应该被赋值,否则你最终会得到一个循环保留关系。

+0

非常感谢您花时间详细解释。 – user1120133 2012-01-15 20:54:35

+0

作为进一步的评论,请注意iOS5.0之前的模态视图控制器没有'presentationViewController',并且不会对这个选择器做出响应。在iOS5.0中,Apple也将'parentViewController'的返回值(!)更改为'nil'。 – SK9 2012-01-16 22:10:02

0

试试这个:

-(void) dismissView: (id)sender 

{ 
    [self dismissModalViewControllerAnimated:YES]; 
} 
+0

现在警告消失,但完成按钮仍然没有关闭模态视图 – user1120133 2012-01-15 20:33:31

+0

我认为按钮应该调用协议方法来解除模态视图 – user1120133 2012-01-15 20:38:12