【问题标题】:function executed after dismissing a view isn't working completly IOS关闭视图后执行的功能无法完全运行 IOS
【发布时间】:2014-08-27 16:46:05
【问题描述】:

我正在开发一个需要用户输入代码的 iphone 应用程序。 我有一个第一个 viewController,当用户使用 -->

触摸按钮时,它将调用我的 passwordPrompt 视图控制器
   [self performSegueWithIdentifier:@"passcodePrompt" sender:self];

密码提示显示正常,我可以输入我的密码,然后当我点击 ok 时,passwordPrompt 视图被关闭 -->

   [self dismissViewControllerAnimated: YES completion:nil]; 

现在当我关闭这个视图控制器时,我从密码提示控制器调用我的 firstViewController 中的一个函数(我尝试使用 dismissViewControllerAnimated 的完成选项并尝试从 viewDidUnload 调用我的函数)-->

    FirstViewController *firstViewControl = [[FirstViewController alloc] init];

    [firstViewControl returnPass:[NSString stringWithFormat:@"%@%@%@%@",digit1.text,digit2.text,digit3.text,digit4.text]]; 

这个函数在我的 FirstViewController 中执行得很好,但即使它执行了那些代码行 -->

[passButton setTitle:@"Password is Correct" forState:UIControlStateNormal];

[(AppDelegate *)[[UIApplication sharedApplication] delegate] deactivateMoveDetection];

infoText.text = @"application unlocked until fully closed by user";

infoText.textColor = [UIColor blackColor];

passButton.tag = 0;

(调试显示它确实执行了这些行而没有任何错误,奇怪的是,在执行该函数后,调试器将我带回到在密码提示控制器中启动解除的函数)

标题没有改变,passButton.tag 没有设置为 0,infoText 没有改变,他的颜色也没有改变。

我一直在寻找 2 天没有运气。 感谢您的帮助

-----passcodePrompt.m -------

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
   self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
   if (self) {
       // Custom initialization
   }
   return self;
}

- (void)viewDidLoad
{
   [super viewDidLoad];
   appDelegate = [[UIApplication sharedApplication]delegate];
   dig1 = false;
   dig2 = false;
   dig3 = false;
   dig4 = false;
   ok.enabled = false;
   // Do any additional setup after loading the view.
}

------- 解决方案 ------

我已添加到我的 passcodePrompt.h -->

@property (nonatomic, retain) FirstViewController *delegate;

为了能够使用 segueWithIdentifier 将 firstViewController 设置为我的密码提示的委托,我必须将其添加到我的 FirstViewcontroller.m -->

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    PasscodePrompt *passprompt = [segue destinationViewController];
    passprompt.delegate = self;
}

从 passwordPrompt.m 中,我在 FirstViewController 中执行了我的函数 -->

[self.delegate returnPass:[NSString stringWithFormat:@"%@%@%@%@",digit1.text,digit2.text,digit3.text,digit4.text]];

【问题讨论】:

    标签: ios objective-c iphone uiviewcontroller dismiss


    【解决方案1】:

    你的问题很可能出在这段代码中:

    FirstViewController *firstViewControl = [[FirstViewController alloc] init];
    
    [firstViewControl returnPass:[NSString stringWithFormat:@"%@%@%@%@",digit1.text,digit2.text,digit3.text,digit4.text]]; 
    

    您没有引用相同的 FistViewController,您正在创建一个新的。这解释了为什么调用该方法并且您的断点被命中,以及为什么您的原始视图控制器没有更新。在这种情况下,您有 两个唯一 视图控制器,第一个是正确的,而您要更新的第二个是全新的。

    请参阅我对此问题的回答,了解如何实现委托,因此您的 FirstViewController 可以是呈现的视图控制器的 delegate,并且在您即将关闭呈现的视图控制器之前,它可以告诉返回密码是委托(原始的 FirstViewController)。

    Calling method from viewcontroller to class xcode

    【讨论】:

    • 感谢你们两位的快速回答。我在另一篇文章中遵循了您的回答,但我使用的是 [self performSegueWithIdentifier:@"passcodePrompt" sender:self];所以我把它改成了 --> PasscodePrompt *passprompt = [[PasscodePrompt alloc] init]; passprompt.delegate = self; [self presentModalViewController:passprompt animated: YES];遵守您的回答,但现在,当视图加载时,它只是显示为黑色,没有动画,也没有内容。有什么想法吗?
    • 密码提示视图控制器的init方法中有什么?
    • initWithNibName 是空的,我从来没有用过,所以我把它留空(我会用代码更新问题)
    • 我也用故事板构建了密码提示,以防万一
    • 它现在可以工作了 :) 感谢您的教程和另一个澄清了一些观点的教程。我会在问题中提出我的解决方案。再次感谢:)
    【解决方案2】:

    您拥有第一个将密码视图控制器推入堆栈的视图控制器...

    密码视图控制器执行其操作然后关闭,返回到第一个视图控制器...

    在您的密码视图控制器的关闭完成块中,您只需分配一个即可创建另一个第一个视图控制器,然后对该对象执行一些操作...

    您在移动到密码视图控制器之前显示的第一个视图控制器与您在完成块中分配(alloc,init)的对象不同,它恰好是 FirstViewController 的对象。

    有多种方法可以解决这个问题。为了简单起见,您可以向密码视图控制器和一组方法添加一个委托对象,以便在密码视图控制器关闭之前它调用委托的方法来更新它需要的新信息的委托。第一个视图控制器就是这个委托。

    【讨论】:

    • 你的回答很好,但由于我对代表不是很熟悉,我赞成一个对我来说更容易的答案。无论如何,谢谢,因为我确实使用了委托方法来解决我的问题。
    • 不用担心。很高兴您找到了问题的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多