Iphone: невозможно загрузить модальное представление из UITabBarController - PullRequest
2 голосов
/ 21 сентября 2009

Я хочу иметь возможность представить модальное представление с экземпляром 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

Ответы [ 2 ]

2 голосов
/ 18 ноября 2009

Вы не должны освобождать делегата в реализации ModalViewController dealloc, поскольку вы (правильно) не сохранили его.

Кроме того, вы можете отстранить модальный контроллер вида от самого себя, вместо того, чтобы устанавливать делегата. Я считаю это проще. Вот обсуждение в Центре разработки iPhone dismissModalViewControllerAnimated:

Родительский контроллер представления ответственность за увольнение модального Посмотреть контроллер он представил с помощью presentModalViewController: анимированные: метод. Если вы вызываете этот метод на Сам контроллер модального вида, однако, контроллер модального вида автоматически пересылает сообщение его родительский контроллер представления.

0 голосов
/ 19 ноября 2009

Как только вы используете

@property (assign) id<ModalDelegate> delegate;

присваивайте тип свойства, вы не должны освобождать делегата в dealloc Ваш код будет работать нормально, если вы будете использовать (сохранять) тип свойства или не освободите делегат в dealloc.

Итак, у вас есть два возможных пути:

@property (retain) id<ModalDelegate> delegate;

или

- (void)dealloc {
 //[delegate release];
    [super dealloc];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...