在解除Modal Segue后更新UIViewController

时间:2012-08-15 20:37:12

标签: ios xcode uiviewcontroller uilabel modalviewcontroller

我目前正在为我的第一款iPhone游戏设计结构并遇到问题。目前,我有一个' MenuViewController'这允许你选择要玩的关卡和一个LevelViewController'水平在哪里。

' MenuViewController'上的UIButton触发对LevelViewController'。

的模态segue

' LevelViewController'上的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的整数属性

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

3 个答案:

答案 0 :(得分: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"];

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

{{1}}

然后在主视图控制器中,使用didViewAppear,例如:

{{1}}

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

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