2012-08-15 23 views
4

我目前正在为我的第一个iPhone游戏设计结构并遇到问题。目前,我有一个'MenuViewController',它允许你选择要玩的级别和一个LevelViewController。解除模态Segue后更新UIViewController

“MenuViewController”上的触发了一个模式的Segue到'LevelViewController'。

在“LevelViewController” A UIButton触发以下方法返回到“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

的整数属性有没有一种方法,我可以更新标签?提前致谢!

回答

0

使属性self.pointsLabel指向的UILabel,那么你可以调用像[self.pointsLabel setText:[NSString stringWithFormat:@"Points: %i", self.playerPoints]];更新使用新的标签得分

+0

听起来像它会工作。但我在哪里打电话?现在,如果我将NSLog(@“菜单加载”)放入我的菜单视图控制器的viewDidLoad中,它不会在调用dismissModalViewController之后从级别返回视图控制器之后重新记录“菜单加载”,这意味着viewDidLoad方法根本没有被调用。如果我在viewDidAppear或viewWillAppear中调用它,它会起作用吗?谢谢。 – 2012-08-15 20:59:04

+0

首先,你确定你正在从你的LevelViewController更新MenuViewController的pointsValue属性吗?你是否像LevelViewController上的'delegate'属性指向MenuViewController? – Ariel 2012-08-15 21:05:23

+0

我不认为我有LevelViewController上的委托属性。这是创建一个的方式吗? '@property(nonatomic,assign)id delegate;' – 2012-08-15 21:12:10

8

这是代表团完美的情况。当LevelViewController完成时,它需要触发一个在MenuViewController中处理的委托方法。这种委托方法应该解除模态VC,然后做任何你需要它做的事情。提交风险投资者通常应该处理对其提出的模态观点的解雇。

这里是如何实现这一个基本的例子:

LevelViewController.h(以上接口声明):

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

相同的文件伊娃段内:

__unsafe_unretained id <LevelViewControllerDelegate> _delegate; 

同档案下面伊娃部分:

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

在LevelViewController.m文件:

@synthesize delegate = _delegate; 
在MenuViewController.h

现在,#import "LevelViewController.h",并宣布自己作为LevelViewControllerDelegate委托:

@interface MenuViewController : UIViewController <LevelViewControllerDelegate> 

现在里面MenuViewController。米实现委托方法:

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

如果这没有意义,我可以试着帮助你理解。

+0

你能否给我一个写一个委托方法的开端?我有一个名为AppDelegate.m的类,AppDelegate.h被导入到MenuViewController和LevelViewController中。而且这个方法会在MenuViewController文件内被调用,因为这是提交VC?谢谢。 – 2012-08-15 21:10:16

+0

与你将要做的事没有关系。 AppDelegate就是这样一个处理应用程序委托方法的类。你需要做的是为特定的协议声明一个委托。我上面提供的例子是你需要的(你可能需要稍微改变它来匹配你的实现 – 2012-08-15 21:27:13

+1

它的工作原理!非常感谢!:) – 2012-08-16 00:18:59

0

在你的模式视图的头文件,添加属性:

@property (nonatomic,assign) BOOL updated; 

然后在您的主视图控制器,使用didViewAppear的东西,如:

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

其中“modalView”是的名称那你可能在那里分配/ init的UIViewController。

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

相关问题