繁体   English   中英

取消视图后执行的功能无法正常运行

[英]function executed after dismissing a view isn't working completly IOS

我正在开发一个iPhone应用程序,该程序需要用户输入代码。 我有一个第一个viewController,当用户使用->触摸按钮时,它将调用我的passwordPrompt视图控制器

   [self performSegueWithIdentifier:@"passcodePrompt" sender:self];

密码提示符显示得很好,我可以输入密码,然后单击确定时,使用->关闭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不变,其颜色也不更改。

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

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

您的问题可能在以下代码段中:

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

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

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

有关如何实现委托的信息,请参见我对这个问题的回答,以便您的FirstViewController可以是显示的视图控制器的委托 ,并且在您要关闭显示的视图控制器之前,可以告诉它是委托(原始的FirstViewController)返回该委托。密码。

从ViewController到Xcode类的调用方法

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

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

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

在移至密码视图控制器之前显示的第一个视图控制器与您在完成块中分配的同一对象(分配,初始化)不同,而该对象恰好是FirstViewController的对象。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM