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

Iphone:无法从UITabBarController加载模式视图,iphone,objective-c,cocoa-touch,iphone-sdk-3.0,Iphone,Objective C,Cocoa Touch,Iphone Sdk 3.0,我希望能够用UIViewController的实例呈现模式视图。在从标准UIViewController(根视图)演示它时,这样做没有问题。我已经设置了一个委托,使呈现根视图关闭模态视图。这是根据苹果公司的最佳实践 当我试图使相同的根视图在从UITabBarController加载根视图时呈现模式视图时,我遇到了严重的问题。前三次加载视图没有问题,但第四次调试程序在尝试调用委托方法时显示根视图已解除分配(“发送到解除分配实例的消息”)。我的猜测是,在显示模式视图时,根视图已经自动删除。我怎样才能

我希望能够用UIViewController的实例呈现模式视图。在从标准UIViewController(根视图)演示它时,这样做没有问题。我已经设置了一个委托,使呈现根视图关闭模态视图。这是根据苹果公司的最佳实践

当我试图使相同的根视图在从UITabBarController加载根视图时呈现模式视图时,我遇到了严重的问题。前三次加载视图没有问题,但第四次调试程序在尝试调用委托方法时显示根视图已解除分配(“发送到解除分配实例的消息”)。我的猜测是,在显示模式视图时,根视图已经自动删除。我怎样才能避免这种情况

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

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

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的
dealloc
实现中释放委托,因为您(正确地)没有保留它

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

父视图控制器为 负责解除合同 使用 presentModalViewController:动画: 方法。如果在 但是,模态视图控制器本身, 模态视图控制器 自动将邮件转发到 它的父视图控制器

一旦你使用

@property (assign) id<ModalDelegate> delegate;
#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
#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
@property (assign) id<ModalDelegate> delegate;
@property (retain) id<ModalDelegate> delegate;
- (void)dealloc {
 //[delegate release];
    [super dealloc];
}