4

我目前正在为我的第一款 iPhone 游戏设计结构,但遇到了问题。目前,我有一个“MenuViewController”,允许您选择要播放的关卡和一个“LevelViewController”,用于播放该关卡。

'MenuViewController' 上的AUIButton触发到 'LevelViewController' 的模态序列。

'LevelViewController' 上的AUIButton触发以下方法返回到 'MenuViewController':

-(IBAction)back:(id)sender //complete
{
    [self dismissModalViewControllerAnimated:YES];
}

问题是,我UILabel在菜单页面上有一个打印玩家总点数的页面。每当我从关卡返回菜单时,我都希望这个标签自动更新。目前,标签是在“MenuViewController”中以编程方式定义的:

-(void)viewDidLoad {
    [super viewDidLoad];
    CGRect pointsFrame = CGRectMake(100,45,120,20);
    UILabel *pointsLabel = [[UILabel alloc] initWithFrame:pointsFrame];
    [pointsLabel setText:[NSString stringWithFormat:@"Points: %i", self.playerPoints]];
    [self.pointsLabel setTag:-100]; //pointsLabel tag is -100 for id purposes
}

self.playerPoints 是 MenuViewController 的整数属性

有没有办法更新标签?提前谢谢!

4

3 回答 3

9

这是委托的完美案例。当 LevelViewController 完成后,它需要触发一个在 MenuViewController 中处理的委托方法。这个委托方法应该关闭模态 VC,然后做任何你需要它做的事情。呈现的 VC 通常应该处理它呈现的模态视图的解雇。

以下是如何实现此功能的基本示例:

LevelViewController.h(在接口声明之上):

@protocol LevelViewControllerDelegate
    -(void)finishedDoingMyThing:(NSString *)labelString;
@end

ivar 部分中的相同文件:

__unsafe_unretained id <LevelViewControllerDelegate> _delegate;

ivar 部分下方的相同文件:

@property (nonatomic, assign) id <LevelViewControllerDelegate> delegate;

在 LevelViewController.m 文件中:

@synthesize delegate = _delegate;

现在在 MenuViewController.h 中,将#import "LevelViewController.h"自己声明为 LevelViewControllerDelegate 的委托:

@interface MenuViewController : UIViewController <LevelViewControllerDelegate>

现在在 MenuViewController.m 中实现委托方法:

-(void)finishedDoingMyThing:(NSString *)labelString {
    [self dismissModalViewControllerAnimated:YES];
    self.pointsLabel.text = labelString;
}

然后确保在呈现模态 VC 之前将自己设置为 LevelViewController 的委托:

lvc.delegate = self;  // Or whatever you have called your instance of LevelViewController

最后,当您完成需要在 LevelViewController 中执行的操作时,只需调用以下代码:

[_delegate finishedDoingMyThing:@"MyStringToPassBack"];

如果这没有意义,我和霍勒可以尝试帮助您理解。

于 2012-08-15T21:06:55.300 回答
0

self.pointsLabel创建一个指向 UILabel的属性,然后你可以调用类似[self.pointsLabel setText:[NSString stringWithFormat:@"Points: %i", self.playerPoints]];的东西来用新分数更新标签

于 2012-08-15T20:45:28.053 回答
0

在模态视图头文件中,添加属性:

@property (nonatomic,assign) BOOL updated;

然后在您的主视图控制器中,将 didViewAppear 与以下内容一起使用:

-(void)viewDidAppear:(BOOL)animated{
    if (modalView.updated == YES) {
        // Do stuff
        modalView.updated = NO;
    }
}

其中“modalView”是您可能在那里分配/初始化的那个 UIViewController 的名称。

如果您想传递更多信息,请添加更多属性,例如用户选择的级别。

于 2015-06-21T02:57:04.917 回答