0

//
// MyGameViewController.h
//
#import < UIKit/UIKit.h >
#import "SecondViewController.h"

@interface MyGameViewController : UIViewController {
IBOutlet SecondViewController *secondViewController;
}
-(IBAction)goToSecondView;
@结尾


//
// MyGameViewController.m
//
#import "MyGameViewController.h"

@implementation MyGameViewController

-(IBAction)goToSecondView{
[self presentModalViewController:secondViewController animated:YES];
}


//
// MyGameView.h
//
#import < UIKit/UIKit.h >
#import "Sprite.h"

@interface MyGameView : UIView {…}

目前我已经在 MyGameView.xib 上实现了一个按钮来调用 secondViewController 视图并且它可以工作。但是我希望在有中断时通过 MyGameView.m 中的编程调用 secondViewController,而不是通过按下按钮。因此,我认为有两种方法:

a) 使 goToSecondView 方法可用于 MyGameView.m
b) 将 MyGameViewController.h 和 MyGameViewController.m 中的所有代码实现到 MyGameView.m。

问题:
1) 当试图使 a) 发生时,我必须使 goToSecondView 方法以 (void) 开头,而不是 (IBAction)。但是如何在 MyGameView.m 中调用它呢?
2) 我尝试做 b) 并将所有代码实现到 MyGameView.m。但是presentModalViewController是ViewController的一个方法,在UIView中不起作用。那么解决方案是什么?

4

1 回答 1

2

正如您所说,您不能在 UIView 类中调用 presentModalViewController 。这似乎是使用委托的绝佳机会。您可以按照以下方式做一些事情:

在 MyGameView.h

@protocol MyGameViewDelegate
- (void)showSecondView;
@end

@interface MyGameView {
}
@property (nonatomic, assign) id <MyGameViewDelegate> delegate;
...
@end

在 MyGameView.m 中,当您需要显示第二个视图时:

[self.delegate showSecondView];

在 MyGameViewController.h 中:

#import "MyGameView.h"
@interface MyGameViewController : UIViewController <MyGameViewDelegate> {
...

在 MyGameViewController.m 中:

#pragma mark MyGameViewDelegate methods

- (void)showSecondView {
    [self goToSecondView];
}

请注意,您还需要将 MyGameViewController 设置为 MyGameView 的委托。您可以在 Interface Builder 或代码中执行此操作,具体取决于您创建这两个对象的位置。

要在代码中执行此操作,例如在 MyGameViewController.h viewDidLoad 方法中:

myGameView.delegate = self;
于 2010-12-10T15:00:04.540 回答