解雇视图后执行的函数不是完全工作的IOS

时间:2014-08-27 16:46:05

标签: ios objective-c iphone uiviewcontroller dismiss

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

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

密码提示显示正常,我可以输入我的密码,然后当我点击确定时,密码提示视图被解除 - >

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

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

标题未更改,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设置为我的passcodeprompt的委托,我必须将它添加到我的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]];

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

Calling method from viewcontroller to class xcode

答案 1 :(得分:1)

你有第一个视图控制器将密码视图控制器推送到堆栈......

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

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

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

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