如何在继续之前强制用户与UIView进行交互?

时间:2013-10-23 09:37:14

标签: ios iphone user-interface uiview uiviewcontroller

在StackOverflow上的许多其他人的帮助下,当用户点击某个人或某人时,我终于可以显示个人资料界面UIView。

但是,在我的应用程序(iOS 6,Xcode 4.6)中,我还需要弹出窗口视图将索引返回到调用的ViewController,因为下一步是使用该索引刷新屏幕。例如,用户单击主ViewController中的顶面或图像,并且应该看到一个允许用户浏览然后选择另一个图像的弹出窗口。当配置文件屏幕被取消时(从弹出窗口中的取消或选择),主屏幕应该使用用户在弹出框中选择的照片更新照片。

现在,我正在使用委托方法将用户在弹出窗口中的选择返回到调用ViewController,然后才解除自身。问题是当我运行我的代码时,在调用ViewController移动到下一步并尝试使用配置文件屏幕在被解除之前更新的变量之前,popover甚至都没有出现。这是一个问题,因为变量是垃圾,直到用户在弹出框中执行某些操作来更新它。

代码的工作原理如下。首先,用户点击主ViewController中的内容:

- (IBAction)handleTapFace1:(UITapGestureRecognizer *)sender
{
    NSLog(@"Face 1 tapped!");
    [self showProfileView:0];

    if (returnedSwitchIndex != NO_SWITCH)
    {
        // Animate switch
        [self performVisualSwitch: selectedFaceIndex to:returnedSwitchIndex];
    }
}

showProfileView是我启动弹出窗口配置文件窗口的功能,其中包含点击面的详细信息,以及浏览每个面以获取替换面的功能。该弹出窗口包含一个取消UIButton,一个Switch UIButton,详细信息。

-(void) showProfileView: (int) tappedIndex
{
    UIStoryboard *storyboard = self.storyboard;

    ProfileViewController *profViewController = [storyboard instantiateViewControllerWithIdentifier:@"ProfileView"];

    // Pass the parameters profView needs to display
    profViewController.currentIndex = tappedIndex;
    profViewController.turnIndex = 0; // <-- TODO: test value

    NSMutableArray* members = [[NSMutableArray alloc] init];
    ... load array with candidate faces ...

    profViewController.faces = [[NSArray alloc] initWithArray:members];

    [self addChildViewController:profViewController];

    profViewController.view.frame = CGRectMake(0, 0, 320, 548);
    [self.view addSubview: profViewController.view];
    profViewController.view.alpha = 0;
    [profViewController didMoveToParentViewController:self];

    NSLog(@"Self located at: %@", NSStringFromCGPoint(self.view.frame.origin));
    NSLog(@"Frame located at: %@", NSStringFromCGPoint(profViewController.view.frame.origin));

    // popup
    [UIView animateWithDuration:0.25 delay:0.0 options:UIViewAnimationOptionCurveLinear animations:^
     {
         profViewController.view.alpha = 1;
     }
                     completion:nil];

    // I previous tried to return a value here, that also failed
    //return profViewController.switchIndex;

    // trying to force redisplay before calling ViewController can proceed
    [profViewController.view setNeedsDisplay];
}

我想我想问的是......“为什么UIView / popover窗口能够在showProfileView的调用者向前移动之前出现?”和“在调用ViewController超出showProfileView行并开始使用returnedSwitchIndex之前,如何强制用户与弹出的UIView或UIViewController进行交互?”也许我的委托解决方案不是这样,但是我如何从显示的UIView返回一些内容?

感谢您的帮助。对不起,请回答所有问题。

PS&gt;我选择使用动画UIView方法,因为我需要调用ViewController继续存在并显示在后台,并且它还包含一个NSTimer,当用户使用弹出视图时向下滴答。没关系,希望让调用ViewController在那里,并让它的NSTimer继续运行,但是在视图有机会实际出现并迫使用户与它交互之前,它在showProfileView之外的代码中前进是完全不好的。取消按钮或浏览并按另一张脸上的切换按钮)

2 个答案:

答案 0 :(得分:1)

我不确定你要求的是什么。但你必须明白UIView操作是一次性完成的。

所以:

用户触摸脸部:

- (IBAction)handleTapFace1:(UITapGestureRecognizer *)sender
{
    NSLog(@"Face 1 tapped!");
    [self showProfileView:0];
}

然后将回调放在另一个方法中:

- (void)goAhead
{
    if (returnedSwitchIndex != NO_SWITCH)
    {
        // Animate switch
        [self performVisualSwitch: selectedFaceIndex to:returnedSwitchIndex];
    }
}

最后,您需要时(在用户与popover交互之后)调用goAhead方法:

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
    [self goAhead];
}

答案 1 :(得分:1)

拉这个东西

if (returnedSwitchIndex != NO_SWITCH)
{
    // Animate switch
    [self performVisualSwitch: selectedFaceIndex to:returnedSwitchIndex];
}

进入自己的方法,并在用户选择或取消时将该方法设置为目标。那应该工作。

要让UIButton调用您的方法,您可以执行以下操作:

[button addTarget:self
           action:@selector(userDidChoose)
 forControlEvents:UIControlEventTouchUpInside];