【问题标题】:Update UIViewController after Dismissing Modal Segue关闭 Modal Segue 后更新 UIViewController
【发布时间】:2012-08-12 04:41:41
【问题描述】:

我目前正在为我的第一款 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 的整数属性

有什么方法可以更新标签吗?提前谢谢!

【问题讨论】:

    标签: ios xcode uiviewcontroller uilabel modalviewcontroller


    【解决方案1】:

    这是委托的完美案例。当 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"];
    

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

    【讨论】:

    • 你能给我一个开始编写委托方法的机会吗?我有一个名为 AppDelegate.m 的类,AppDelegate.h 被导入到 MenuViewController 和 LevelViewController 中。是否会在 MenuViewController 文件中调用此方法,因为那是呈现的 VC?谢谢。
    • 与您将要做什么无关。 AppDelegate 就是这样,一个处理应用程序委托方法的类。您需要做的是为特定协议声明一个委托。我上面提供的示例是您所需要的(您可能需要稍微更改它以匹配您的实现
    • 完美运行!谢谢
    【解决方案2】:

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

    【讨论】:

    • 听起来好像可以。但我在哪里称呼它?现在,如果我将 NSLog(@"menu loaded") 放在我的菜单视图控制器的 viewDidLoad 中,它不会在调用 dismissModalViewController 后从级别返回到视图控制器后重新记录“菜单加载”,这意味着viewDidLoad 方法根本没有被调用。如果我在 viewDidAppear 或 viewWillAppear 中调用它会起作用吗?谢谢。
    • 首先,您确定要从您的 LevelViewController 更新 MenuViewController 的 pointsValue 属性吗?您是否在 LevelViewController 上有一个指向 MenuViewController 的 delegate 属性?
    • 我认为我在 LevelViewController 上还没有委托属性。这会是创建一个的方法吗? '@property (nonatomic, assign) id delegate;'
    • 不,只需像这样在 LevelViewController 上添加一个属性:@property (strong, nonatomic) MenuViewController *delegate,然后当您从 MenuViewController 实例化 LevelViewController 时,您执行以下操作:(假设新的 LevelViewController 实例称为 levelViewController)@ 987654326@。然后显示模态视图控制器等。然后在 (IBAction)back:(id)sender 方法中使用新的玩家点值更新 self.delegate.playerPoints,并使用上面的代码更新标签。
    【解决方案3】:

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

    @property (nonatomic,assign) BOOL updated;
    

    然后在你的主视图控制器中,使用 didViewAppear 类似的东西:

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-03-20
      • 2021-05-21
      • 2016-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多