从UINavigation Controller Done Button解决modalviewcontroller时出现问题

时间:2012-01-15 20:25:36

标签: iphone

当点击完成按钮应用程序崩溃并发出程序收到信号SIGABRT的消息时。

在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中。 m档

@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无法识别的选择器

帮助将不胜感激。

由于

2 个答案:

答案 0 :(得分:3)

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

我觉得你对使用ModalViewDelegate感到有些困惑,让我试着解释......

在Apple View Controller编程指南中,建议显示模态控制器的ViewController负责解除它。因此,您需要一种方式让模态控制器与呈现控制器通信。

所以...你的演示控制器应该符合你的ModalViewDelegate协议(而不是你在这里的模态控制器)。

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

你的dismissView方法应该是:

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

实际上,您可能甚至不需要将UIViewController参数传递给委托,因为您最终不会使用它。

最后,你的dismissDelegate属性确实不应该被保留,而是应该分配它(否则你最终会得到一个循环保留关系)。

答案 1 :(得分:0)

试试这个:

-(void) dismissView: (id)sender

{
    [self dismissModalViewControllerAnimated:YES];
}