在解除Modal Segue后更新UIViewController

fel*_*iao 4 xcode uiviewcontroller uilabel modalviewcontroller ios

我目前正在为我的第一款iPhone游戏设计结构并遇到问题.目前,我有一个'MenuViewController',它允许你选择要播放的关卡和一个'LevelViewController'来播放关卡.

UIButton'MenuViewController'上的A 触发了'LevelViewController'的模态segue.

UIButton'LevelViewController'上的A 触发以下方法返回'MenuViewController':

-(IBAction)back:(id)sender //complete
{
    [self dismissModalViewControllerAnimated:YES];
}
Run Code Online (Sandbox Code Playgroud)

问题是,我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
}
Run Code Online (Sandbox Code Playgroud)

self.playerPoints是MenuViewController的整数属性

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

LJ *_*son 9

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

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

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

@protocol LevelViewControllerDelegate
    -(void)finishedDoingMyThing:(NSString *)labelString;
@end
Run Code Online (Sandbox Code Playgroud)

ivar部分内的相同文件:

__unsafe_unretained id <LevelViewControllerDelegate> _delegate;
Run Code Online (Sandbox Code Playgroud)

ivar部分下面的相同文件:

@property (nonatomic, assign) id <LevelViewControllerDelegate> delegate;
Run Code Online (Sandbox Code Playgroud)

在LevelViewController.m文件中:

@synthesize delegate = _delegate;
Run Code Online (Sandbox Code Playgroud)

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

@interface MenuViewController : UIViewController <LevelViewControllerDelegate>
Run Code Online (Sandbox Code Playgroud)

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

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

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

lvc.delegate = self;  // Or whatever you have called your instance of LevelViewController
Run Code Online (Sandbox Code Playgroud)

最后,当你完成LevelViewController中你需要做的事情时,只需调用:

[_delegate finishedDoingMyThing:@"MyStringToPassBack"];
Run Code Online (Sandbox Code Playgroud)

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


小智 0

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