0

私は iOS 開発の初心者で、barButtomItem をタップするとポップオーバーを表示しようとしています。これまでのところ、私はこれを持っています:

-(IBAction)shareButtonPressed :(id)sender{    
    UIViewController *popoverViewController = [[UIViewController alloc] initWithNibName:@"ShareOptionsViewController" bundle:nil];
    popoverViewController.contentSizeForViewInPopover = CGSizeMake(319, 422);

    self.popoverController = [[UIPopoverController alloc] initWithContentViewController:popoverViewController];
    [self.popoverController presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny  animated:NO];
}

このコードは機能し、正しいボタンをタップするとポップオーバーが表示されます。問題は、popOver が表示されているときにボタンをもう一度タップすると、アプリがクラッシュすることです。既に作成されている変数を割り当てようとしているためです。解決策は、ポップオーバーが読み込まれたときにボタンを無効にする必要があると思いますが、ポップオーバーが閉じられたときに再度アクティブにする方法がわかりません。

私は正しいですか?popOver が閉じられたときにボタンを有効にするにはどうすればよいですか?

4

5 に答える 5

1

まず、shareButtonPressed メソッドでボタンを無効にする必要があります。

-(IBAction)shareButtonPressed :(id)sender{    
UIViewController *popoverViewController = [[UIViewController alloc] initWithNibName:@"ShareOptionsViewController" bundle:nil];
popoverViewController.contentSizeForViewInPopover = CGSizeMake(319, 422);

self.popoverController = [[UIPopoverController alloc] initWithContentViewController:popoverViewController];
[self.myButton setEnabled:NO];
[self.popoverController presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny  animated:NO];
}

次に、View Controller を UIPopoverControllerDelegate プロトコルに準拠させます。その後、popoverControllerDidDismissPopover メソッドを実装します。

-(void)popoverControllerDidDismissPopover:(UIPopoverController *)popoverController
{
if (!self.myButton.enabled) // Just to make sure the button is disabled.
    [self.myButton setEnabled:YES];

}
于 2013-02-21T11:38:23.763 に答える
0

このようにコードを変更するだけです...

-(IBAction)shareButtonPressed :(id)sender{    
        UIViewController *popoverViewController = [[UIViewController alloc] initWithNibName:@"ShareOptionsViewController" bundle:nil];
        popoverViewController.contentSizeForViewInPopover = CGSizeMake(319, 422);

         if(self.popoverController)
          {
            [self.popovercontroller dismissPopoverAnimated:YES];
            self.popovercontroller = nil;
           }   
        self.popoverController = [[UIPopoverController alloc] initWithContentViewController:popoverViewController];
        [self.popoverController presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny  animated:NO];
    }
于 2013-02-21T11:35:15.733 に答える
0

この「イベント --> 責任者」リストを見てください。

1) ボタンが押された --> MainViewController - IBAction

2) ポップオーバー表示 --> MainViewController - IBAction

3) ボタン無効 --> MainViewController - IBAction

4) ポップオーバー dissmis --> popoverDelegate - popoverControllerDidDismissPopover

5) ボタンを有効にする --> popoverDelegate - popoverControllerDidDismissPopover

したがって、ポップオーバーのデリゲートが MainViewController の場合、ボタンにアクセスできます。別のクラスの場合は、ボタンを元に戻すためにプロトコルを設定する必要があります。

さらに説明が必要な場合は教えてください...

于 2013-02-21T11:31:46.990 に答える
0

ポップオーバーが表示され、閉じられているかどうかを検出できます。

- (IBAction)shareButtonPressed :(id)sender{
    if (self.popoverController) {
        [self.popoverController dismissPopoverAnimated:YES];
        self.popoverController = nil;
    } else {
        UIViewController *popoverViewController = [[UIViewController alloc] initWithNibName:@"ShareOptionsViewController" bundle:nil];
        popoverViewController.contentSizeForViewInPopover = CGSizeMake(319, 422);

        self.popoverController = [[UIPopoverController alloc] initWithContentViewController:popoverViewController];
        [self.popoverController presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny  animated:NO];
    }
}

または、ボタンを無効にするだけの場合:

- (IBAction)shareButtonPressed :(id)sender{
    ...
    UIButton *button = (UIButton *)sender;
    button.enabled = NO;
}

ただし、この場合、ユーザーがいつボタンを閉じてpopOverボタンを再度有効にするかを検出する必要があります。クラスでUIPopoverControllerデリゲートを採用することでこれを行うことができます(ドキュメントを参照)

于 2013-02-21T11:34:35.317 に答える
0

インスタンスがすでに作成されているかどうかを確認してください。

-(IBAction)shareButtonPressed:(id)sender
{
    if (self.popoverController == nil) {
        self.popoverController = alloc/init...;
        [_popoverController present...];
    } else {
        if (self.popoverController.popoverVisible)
            [self.popoverController dismissPopoverAnimated:YES];
        self.popoverController = nil;
    }
}

アニメーションが完了する前にガベージ コレクションが行われ、無効なユーザー エクスペリエンスが生じる可能性があります。次に、可能であれば、viewDidLoad またはコンストラクターなどでインスタンスを事前に作成し、必要に応じて表示および非表示にして、表示可能なプロパティを確認します。

于 2013-02-21T11:27:24.167 に答える