web-dev-qa-db-ja.com

UIAlertControllerが消えないようにする

UIAlertControllerが消えないようにしたいと思います。

UIAlertTextFieldに文字列を追加するだけのUIAlertActionがありますが、タップするとView Controllerが削除されます[不要]。望ましくない結果を伴うNSNotificationを追加しようとしました。

    UIAlertAction *pasteMessage = [UIAlertAction actionWithTitle:@"Paste Message" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
        UITextField *textField = alertC.textFields.firstObject;
        textField.text = [textField.text stringByAppendingString:[NSString stringWithFormat:@"%@", copiedString]];
    }];

また、次の方法でpasteMessageにnoを設定しようとしました。

 [alertC canPerformAction:@selector(dismissViewControllerAnimated:completion:) withSender:pasteMessage];

-(void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion {
    UIAlertController *alertController = (UIAlertController *)self.presentedViewController;
    UIAlertAction *paste = alertController.actions.firstObject;
       if (paste) {
         flag = NO;
       } else {
         flag = YES;
       }
 }

編集、私はUIAlertActionのタッピングを防ぐつもりはありません。私はUIAlertControllerが上記のアクションをタップするときに消えないようにします。アクションは何でも有効/無効にすることができますが、私の目標は、アクションを押してコピーされたメッセージをUITextFieldに貼り付けることです(そのため、却下されたくない理由です)

また、BOOLをdismissViewControllerAnimated:に設定すると、単にnotに設定されることに気付きました。実際の解雇プロセスを停止するためでした。私の目標に関連して私が試したものを単に提供する。また、pasteMessageを選択するときにnewUIAlertControllerを表示しようとしましたnewUIAlertControllersコピーされたメッセージを含むtextField、それは動作しますが、何ができるかにはあまりにもハッキングだと感じています。

29
soulshined

編集:

Swiftに更新

だから私は実際にこれを機能させました。つまり、解雇が発生する前にトリガーするジェスチャレコグナイザーをUIAlertControllerに追加する必要があります。

まず、UIAlertControllerおよびUIAlertActionの遅延ロードされた計算変数を作成し、ジェスチャーコントローラーのセレクターメソッド(selfは、これらすべてがView Controller内にあることをほのめかします)。

lazy var alert: UIAlertController = {

    let alert = UIAlertController(title: "Title", message: "Message", preferredStyle: .alert)

    alert.addTextField(configurationHandler: nil)

    let appendAction = self.appendAction
    let cancelAction = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)

    alert.addAction(appendAction)
    alert.addAction(cancelAction)

    let gestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(self.append(sender:)))
    gestureRecognizer.minimumPressDuration = 0.0
    alert.view.addGestureRecognizer(gestureRecognizer)

    return alert
}()

lazy var appendAction: UIAlertAction = {
    return UIAlertAction(title: "Paste Message", style: .default, handler: nil)
}()

上記のジェスチャレコグナイザが、最小のプレス時間0で設定されたUILongPressGestureRecognizerであることを確認してください。そうすることで、アクションが完全にトリガーされる前にジェスチャの状態にアクセスできます。そこで、UIAlertActionを無効にし、カスタムコードを実装し、ジェスチャが完了した(ユーザーが修正した)後、アクションを再度有効にすることができます。下記参照:

@objc func append(sender: UILongPressGestureRecognizer) {

    if sender.state == .began {
        appendAction.isEnabled = false
    } else if sender.state == .ended {
        // Do whatever you want with the alert text fields
        print(alert.textFields![0].text)
        appendAction.isEnabled = true
    }
}

次に、どこでもUIAlertControllerを提示します。

@IBAction func showAlert(sender: AnyObject) {
    self.present(alert, animated: true, completion: nil)
}

これは明らかにハックですが、ハックなしでこれを達成するための方法は他にありません。たとえば、ジェスチャレコグナイザーはUIAlertControllerに関連付けられているため、ユーザーはアラートの任意の場所(キャンセルボタン以外)をタップすると、そのメソッドをトリガーできます。

元の回答:

これは、私がハックアラウンドに到達するのと同じくらい近いです。解雇移行時間をゼロにカスタマイズする方法があれば、animated: falseにすると、同じアラートのように見えますが、可能だとは思いません

class ViewController: UIViewController {

    @IBAction func alert(sender: AnyObject) {
        let alert = UIAlertController(title: "title", message: "message", preferredStyle: .Alert)

        alert.addTextFieldWithConfigurationHandler(nil)

        let appendAction = UIAlertAction(title: "Append text", style: .Default) { _ in
            var textField = alert.textFields![0] as UITextField
            // Append text here
            self.presentViewController(alert, animated: true, completion: nil)
        }

        let cancelAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil)

        alert.addAction(appendAction)
        alert.addAction(cancelAction)

        self.presentViewController(alert, animated: true, completion: nil)
    }
}

私はスウィフトにしか精通していない

26
Aaron

ほぼ同じ質問に答えます here

アラートのテキストフィールドは貼り付けオプションをサポートしているため、「貼り付け」オプションを示す別のボタンをアラートに表示する本当の理由はありません。

それ以外の場合は、UIAlertControllerを模倣し、desireadの動作で再実装する必要があります。