1

我有一个UIAlertView带有 2 个按钮的重新加载按钮 - 确定和取消。取消按钮工作正常,但是当我想在 OK 按钮中放置一些操作(再次玩游戏)时不起作用,除非该操作是NSLog.

我的代码在 m 中。文件:

- (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协议放入 h. 文件

那么,为什么viewDidLoad再次调用该方法时不起作用?

4

1 回答 1

5

为了重新加载......你应该做一个

- (void)reloadGame {}

方法并手动重置所有内容。就像是:

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

您也可以定义一些常量,这样您就不会对所有内容进行硬编码。并在 ViewDidLoad 和 reloadGame ...

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

而不是为同一个类拥有 2 个 .m 文件:您应该将 popOver 类设为不同的类,并将其设置为您的游戏类:

在您的 popOver 课程中,您应该这样做:

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

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

当您在游戏类中打开 popOver 时,您应该添加:

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

还要确保你的游戏类监听 popover 委托方法

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

并在您的 customPopover 类中的一个方法中,您想要转发到您刚刚放置的游戏类

- (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];
}
}

和你将放置的游戏类

- (void)doSomething {
//whatever 
}

你也可以发送参数


你也可以子类化......(当然popover是另一个拥有它自己的.h的类)

并将其声明为子类(您可以在创建新类时执行此操作并输入要子类化的类名,如下图所示)

在此处输入图像描述

并且您的弹出视图的标题将如下所示:

@interface  CustomPopoverView : GameView

并且 GameView 的所有方法和属性都可用。

于 2013-08-23T13:51:55.697 回答