Не могу отклонить модальный вид при нажатии кнопки - PullRequest
0 голосов
/ 14 октября 2011

В «FirstViewController» я объявляю кнопку, которая представляет модальное представление «InfoViewController».

В «InfoViewController» я объявляю панель инструментов с UIButton «modalViewButton», который отклоняет модальное представление. Но «OK» UIButton не работает. Я не знаю почему.

Вот FirstViewController.h

#import <UIKit/UIKit.h>
#import "InfoViewController.h"

@interface FirstViewController : UIViewController 
{
    InfoViewController *infoViewController; 
}

@property (nonatomic, retain) InfoViewController *infoViewController;
@end

Вот FirstViewController.m

#import "FirstViewController.h"
@implementation FirstViewController
@synthesize infoViewController;

- (IBAction)modalViewAction:(id)sender
{  
    if (self.infoViewController == nil)
        self.infoViewController = [[[InfoViewController alloc] initWithNibName:
                                NSStringFromClass([InfoViewController class]) bundle:nil] autorelease];
    [self presentModalViewController:self.infoViewController animated:YES];
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

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

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

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIButton* modalViewButton = [UIButton buttonWithType:UIButtonTypeInfoLight];
    [modalViewButton addTarget:self 
                    action:@selector(modalViewAction:) 
          forControlEvents:UIControlEventTouchUpInside];
    UIBarButtonItem *modalBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:modalViewButton];
    self.navigationItem.leftBarButtonItem = modalBarButtonItem;
    [modalBarButtonItem release];
}

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

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

@end

Вот InfoViewController.h

#import <UIKit/UIKit.h>     
@interface InfoViewController : UIViewController 
{

}
-(IBAction)infoDismissAction:(id)sender;
@end

Вот InfoViewController.m

#import "InfoViewController.h"

@implementation InfoViewController

- (IBAction)infoDismissAction:(id)sender
{
    [self.parentViewController dismissModalViewControllerAnimated:YES];
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) 
    {

    }
    return self;
}

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

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

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];

    UILabel *infoLabel = [[UILabel alloc] init];
    infoLabel.frame = CGRectMake(50, 100, 100, 40);     
    infoLabel.textAlignment = UITextAlignmentCenter;        
    infoLabel.text = @"About";      
    [self.view addSubview:infoLabel];       

    UIToolbar *toolBar;
    toolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 50)];
    toolBar.frame = CGRectMake(0, 0, 320, 50);
    toolBar.barStyle = UIBarStyleDefault;
    [toolBar sizeToFit];    

    UIBarButtonItem *flexibleSpace = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:                               UIBarButtonSystemItemFlexibleSpace 
                                                                                target:nil 
                                                                                        action:nil] autorelease];

    UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithTitle:@"OK" 
                                                                   style:UIBarButtonItemStyleBordered 
                                                              target:self 
                                                              action:@selector(infoDismissAction:)];

    UIBarButtonItem* infoTitle = [[UIBarButtonItem alloc] initWithTitle:@"About" 
                                                              style:UIBarButtonItemStylePlain 
                                                             target:self action:nil];

    NSArray *barButtons = [[NSArray alloc] initWithObjects:flexibleSpace,flexibleSpace,infoTitle,flexibleSpace,doneButton,nil];

    [toolBar setItems:barButtons];

    [self.view addSubview:toolBar]; 

    [toolBar release];
    [infoTitle release];
    [doneButton release];
    [barButtons release];
    [infoLabel release];
}

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

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

@end

Ответы [ 5 ]

3 голосов
/ 14 октября 2011

Я бы решил эту проблему с помощью метода делегата.

Сначала создайте протокол в вашем modalViewController

@protocol ModalViewDelegate <NSObject>

 - (void)didDismissModalView;

@end

И установите свойство делегата в том же modalVC:

id<ModalViewDelegate> dismissDelegate;

Затем создайте buttonActionMethod, который вызывает делегат в modalVC:

- (void)methodCalledByButton:(id)sender 
{
    // Call the delegate to dismiss the modal view
    [self.dismissDelegate didDismissModalView];
}

Теперь ваш modalVC готов, вы должны подготовить mainVC, вызывающий modalVC: вы должны заставить свой MainViewController соответствовать делегату.:

@interface MainViewController : UIViewController <ModalViewDelegate>

В месте, где вы выделяете ваш ModalViewController, вы должны установить свойство делегата, которое вы сделали в вашем modalViewController:

self.myModalViewController.dismissDelegate = self;

Теперь MainViewController слушает делегата и единственное, что нужновам нужно реализовать делегатный метод.

-(void)didDismissModalView
{
    [self dismissModalViewControllerAnimated:YES];
}

Теперь ваш ModalVC будет отпускать при нажатии кнопки (по крайней мере, когда вы вызываете метод должным образом)

Надеюсь, все это имеет смысл.Удачи.

1 голос
/ 14 октября 2011

Вы можете отклонить только отображаемое в данный момент модальное представление, поэтому в вашем методе infoDismissAction: вы должны выполнить одно из следующих действий:

1) [self dismissModalViewControllerAnimated:YES];

2) Отправить на parent view controller сообщениеэтот текущий модальный вид следует отклонить и отправить ссылку на этот вид.

Второй подход лучше, так как он более безопасен.

0 голосов
/ 30 августа 2016

Текущие ответы устарели.Вот обновленный код:

[self dismissViewControllerAnimated:NO completion:nil];
0 голосов
/ 14 октября 2011

Вот лучший пример кода для представления модели также для iphone и ipad.

У всплывающих окон есть несколько настраиваемых элементов.Они могут быть анимированы для скольжения или всплывающих на дисплее.После того, как они видны, их можно убрать, коснувшись экрана или запрограммированной задержки.Цвет фона и текста также можно настроить по своему усмотрению.

Загрузите образец кода здесь.

0 голосов
/ 14 октября 2011

В вашем -infoDismissAction попробуйте позвонить [self dismissModalViewControllerAnimated:YES];

...