0

StackOverflow の他の多くの人の助けを借りて、ユーザーが特定の顔や人をタップしたときに、プロフィール画面のポップオーバー UIView を表示できるようになりました。

ただし、私のアプリ (iOS 6、Xcode 4.6) では、呼び出し側の ViewController にインデックスを返すポップオーバー ビューも必要です。これは、次のステップでそのインデックスを使用して画面を更新するためです。たとえば、ユーザーがメインの ViewController の上面または画像をクリックすると、ユーザーが別の画像を参照して選択できるポップオーバーが表示されます。プロファイル画面が (ポップオーバー内の [キャンセル] または [選択] から) 閉じられると、メイン画面は、ユーザーがポップオーバーで選択した写真で写真を更新する必要があります。

現在、デリゲート メソッドを使用して、ポップオーバーでのユーザーの選択を呼び出し元の ViewController に戻してから、それ自体を破棄しています。問題は、コードを実行すると、呼び出し元の ViewController が次のステップに移動し、プロファイル画面が更新される変数を使用してから閉じられる前に、ポップオーバーが表示されないことです。ユーザーがポップオーバーで何かを行って更新するまで、変数はジャンクであるため、これは問題です。

コードは次のように機能します。まず、ユーザーはメインの ViewController で何かをタップします。

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

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

showProfileView は、ポップオーバー プロファイル ウィンドウを起動する機能で、タップされた顔の詳細と、すべての顔を参照して置換顔を探す機能を備えています。ポップオーバーには、詳細情報の中に Cancel 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];
}

私が聞きたいのは...「showProfileViewの呼び出し元が進む前にUIView/ポップオーバーウィンドウが表示されないのはなぜですか?」および「呼び出し元の ViewController が showProfileView 行を超えて戻り、returnedSwitchIndex の使用を開始する前に、ユーザーにポップアップされた UIView または UIViewController と対話させるにはどうすればよいですか?」私のデリゲート ソリューションはうまくいかないかもしれませんが、表示された UIView から何かを返すにはどうすればよいでしょうか。

ご協力いただきありがとうございます。質問ばかりですみません。

PS > アニメーション UIView アプローチを使用することにしました。これは、ViewController を呼び出して存在し続け、バックグラウンドで表示する必要があり、ユーザーがポップオーバー ビューで作業しているときに NSTimer が刻々と変化することも含まれているためです。呼び出し元の ViewController とその NSTimer を実行し続けることは問題ありませんが、ビューが実際に表示されてユーザーとの対話を強制する機会が得られる前に (またはボタンをキャンセルするか、ブラウジングして別の顔でスイッチボタンを押す)

4

2 に答える 2

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

最後に、必要に応じて (ユーザーがポップオーバーを操作した後)、たとえば次のように goAhead メソッドを呼び出します。

- (void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
    [self goAhead];
}
于 2013-10-23T09:48:12.580 に答える
1

このものを引っ張る

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

独自のメソッドに出力し、ユーザーが選択またはキャンセルしたときにそのメソッドをターゲットとして設定します。それはうまくいくはずです。

メソッドを呼び出す UIButton を取得するには、次のようにします。

[button addTarget:self
           action:@selector(userDidChoose)
 forControlEvents:UIControlEventTouchUpInside];
于 2013-10-23T09:49:35.177 に答える