Iphone:无法从UITabBarController加载模态视图

时间:2009-09-21 18:12:25

标签: iphone objective-c cocoa-touch iphone-sdk-3.0

我希望能够使用UIViewController的实例呈现模态视图。从标准的UIViewController(根视图)中呈现它时,我没有问题。我已经设置了一个委托来使显示根视图关闭模态视图。这是根据Apple的最佳实践。

当我尝试使用相同的根视图显示从UITabBarController加载根视图时的模态视图我遇到了严重的问题。前三次我没有加载视图的问题,但第四次调试器显示在尝试调用委托方法时释放了根视图(“消息发送到deallocated instance”)。我的猜测是,在显示模态视图时,根视图已自动释放。我怎么能避免这个?

我设置的示例使用UITabBarController的模板,从第一个视图中显示模态视图:

FirstViewController.h(根视图控制器):

#import <UIKit/UIKit.h>

@protocol ModalDelegate;
@interface FirstViewController : UIViewController <ModalDelegate>{
}

-(IBAction)startPressed:(id)sender;
@end

FirstViewController.m:

#import "FirstViewController.h"
#import "ModalViewController.h"


@implementation FirstViewController

-(IBAction)startPressed:(id)sender
{
 ModalViewController *modal=[[ModalViewController alloc] init];
 modal.delegate=self;
 [self presentModalViewController:modal animated:TRUE];
 [modal release];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (void)dealloc {
    [super dealloc];
}

#pragma mark Modal Delegate
-(void)modal:(ModalViewController *)controller
{
 [self dismissModalViewControllerAnimated:YES];
}

@end

ModalViewController.h:

#import <UIKit/UIKit.h>

@protocol ModalDelegate;


@interface ModalViewController : UIViewController {
 id<ModalDelegate> delegate;

}

@property (assign) id<ModalDelegate> delegate;

- (IBAction)OKPressed:(id)sender;

@end

@protocol ModalDelegate <NSObject>

@optional
-(void)modal:(ModalViewController *)controller;

@end

ModalViewController.m:

#import "ModalViewController.h"

@implementation ModalViewController
@synthesize delegate;
- (IBAction)OKPressed:(id)sender
{
 if ([self.delegate respondsToSelector:@selector(modal:)]) //Check to see if method responds to selector
 {
  [self.delegate modal:self];
 }
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (void)dealloc {
 [delegate release];
    [super dealloc];
}

@end

2 个答案:

答案 0 :(得分:2)

你不应该在ModalViewController的dealloc实现中释放委托,因为你(正确地)没有保留它。

此外,您可以从自身中解除模态视图控制器,而不是设置委托。我觉得这个更简单。以下是iPhone开发人员中心对dismissModalViewControllerAnimated:

的讨论
  

父视图控制器是   负责解雇模态   查看它使用的控制器   presentModalViewController:动画:   方法。如果你在上面调用这个方法   然而,模态视图控制器本身,   模态视图控制器   自动转发消息   它的父视图控制器。

答案 1 :(得分:0)

一旦使用

@property (assign) id<ModalDelegate> delegate;

指定属性类型,不应在dealloc中释放委托 如果您将使用(保留)属性类型,或者不会在dealloc中释放委托,您的代码将正常工作。

所以你有两种可能的方式:

@property (retain) id<ModalDelegate> delegate;

- (void)dealloc {
 //[delegate release];
    [super dealloc];
}