2013-08-23 2 views
1

У меня есть UIAlertView с кнопкой перезагрузки с 2 кнопками - ОК и Отмена. Кнопка «Отмена» отлично работает, но когда я хочу добавить какое-либо действие (повторить игру), кнопка «OK» не работает, если это действие не будет NSLog.Как я могу делать действия в кнопках UIAlertView?

Мой код в м. Файл:

- (IBAction)startAgainAction:(id)sender { 

    UIAlertView *alert = [[UIAlertView alloc] 
         initWithTitle:@"Warning" message:@"Have you short that want start again the game?" 
         delegate:self 
         cancelButtonTitle:@"OK" 
         otherButtonTitles:@"Cancel", nil]; 

    [alert show]; 
} 

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 

    // My OK button 

    if (buttonIndex == alertView.cancelButtonIndex) { 

     // Action to start the game again... (don't work) 
     [self viewDidLoad]; 

    } else if (buttonIndex == alertView.firstOtherButtonIndex) { 

     // NSLog it's accept but not other actions... 
     NSLog(@"Cancel"); 
    } 

} 

И да, я поставил UIAlertViewDelegate протокол в час. file

Итак, почему viewDidLoad не работает, когда он снова называет метод?

+4

Почему я могу спросить, пытаетесь ли вы сами вызвать viewDidLoad? –

+2

Кроме того, если вы не работаете, но NSLog делает, что-то не так с указанным действием. Отправьте код для этого и покажите, как вы его вызываете. –

+0

Поскольку мне нужно перезагрузить игру, инициализируйте все, как и начало. – tixa

ответ

5

Для перезагрузки ... вы должны сделать метод

- (void)reloadGame {} 

и сбросить все вручную. Что-то вроде:

- (void)reloadGame { 
self.highScore = 0; 
self.ballPosition = ... 
// etc. depends on what you have 
} 

Также вы могли бы определить некоторые константы, чтобы вы не кодировали все. и дать им как в ViewDidLoad и reloadGame ... или еще лучше ... переместить весь код внутри viewDidLoad в reloadGame и изменить его таким образом:

- (void)viewDidLoad { 
[super viewDidLoad]; 
[self reloadGame]; 
} 

Вместо 2 файлов .m для тот же класс: вы должны сделать свой класс поповер другой один и установить его делегат к классу игры:

в своем классе поповер вы должны сделать:

@protocol CustomPopoverViewDelegate <NSObject> 
- (void)doSomething; 
// add other methods you need 
@end 

@interface CustomPopoverView : UIView 
@property (nonatomic, retain) id <CustomPopoverView> delegate; 

и когда вы открываете поповер в классе игры вы должны добавить:

//popover init/alloc 
popover.delegate = self; 
//show popover 

также убедитесь, что ваш игровой класс слушает карапуз метода поповер делегата

#import "CustomPopoverView.h" 
@interface GameViewClass : UIViewController <CustomPopoverViewDelegate> 

и в своем классе customPopover в методе вы хотите направить на ваш gameclass вы просто положить

- (void)methodNameForDoSomething { 
if ([self.delegate respondsToSelector:@selector(doSomething)]) { //always nice to check. Notice this is the same doSomething we declared in .h in the protocol 
    [self.delegate doSomething]; 
} 
} 

и gameClass вы поставите

- (void)doSomething { 
//whatever 
} 

Вы также можете отправить параметры


Вы также подкласс ... (конечно, пирог еще один класс с его собственной.ч)

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

enter image description here

и ваш Заголовок popover view будет выглядеть так:

@interface CustomPopoverView : GameView 

и будет иметь все доступные методы и свойства GameView.

+0

. Я буду больше конкретный. У меня есть кнопка плюс в моей панели навигации, и когда я нажимаю, появляется UIView, как popover, у которого есть 4 кнопки, одна из них - кнопка перезагрузки. Я поместил кнопку перезагрузки UIAlertView для подтверждения пользователем или нет, если вы хотите начать игру с начала. У этого UIAlertView есть 2 кнопки - ОК и Отмена - оба работают нормально с NSLog, но когда я вызываю методы, такие как viewDidLoad или другие (любые другие), не работают. Представление, которое действует как popover, и представление игры имеет одинаковое значение m. файл для вызова методов. – tixa

+0

у вас нет, и вы не должны вызывать viewDidLoad самостоятельно. Также мне нехорошо, что два разных представления используют один и тот же файл .m. Лучшим подходом могло бы стать подклассы или делегаты. –

+0

Да, я изменил код для вызова метода, а не viewDidLoad. Спасибо за это. Но, я действительно не знаю, как я могу вызвать внутри моего popover UIView методы, которые у меня есть в m. файл моей игры UIView, я могу перезагрузить игру. Можете ли вы мне помочь? – tixa

Смежные вопросы