Я хочу иметь возможность представить модальное представление с экземпляром UIViewController. У меня нет проблем с этим при представлении из стандартного UIViewController (корневое представление). Я настроил делегата, чтобы сделать представление корневого представления близким к модальному представлению. Это соответствует рекомендациям Apple.
Когда я пытаюсь сделать то же корневое представление модальным, когда корневое представление загружается из UITabBarController, у меня возникают серьезные проблемы. Первые три раза у меня не возникает проблем с загрузкой представления, но в четвертый раз отладчик показывает, что корневое представление освобождается при попытке вызвать метод делегата («сообщение отправлено освобожденному экземпляру»). Я предполагаю, что корневой вид был автоматически выпущен, пока модальный вид был показан. Как я могу избежать этого?
В примере, который я настроил, используется шаблон для 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