1

UIAlertViewリンクが で開くことをユーザーに警告するために を追加しようとしていますSafari。次に、ユーザーは [OK] (URL を開く) または [キャンセル] を選択して、アラートを閉じてリンクに戻ることができます。私は3つの異なるUIButtonsを持つ3つの異なるsを持っていURLます。

現在、すべてのボタンに aIBActionを追加しており、すべてのボタンにタグが付いています (何とか使用できると思います:D)。デリゲートは使いやすいと思い- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:ます..

私の質問:ユーザーが [OK] をクリックして開くものをUIAlertViewどのように知る必要がありますか?URL

4

3 に答える 3

1

次のように解決しました: のtag作成時に a を追加しましたUIAlertView。このような:

- (IBAction)PressedButton {

    UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"Link"
                                                      message:@"Want to open in safari?"
                                                     delegate:self
                                            cancelButtonTitle:@"Ok"
                                            otherButtonTitles:nil];

    message.tag = 2;        //different tag for each button

    [message addButtonWithTitle:@"Cancel"];
    [message show];

}

次に、- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndexデリゲートがスローされたとき、私はこれを行いました:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{

    if (buttonIndex == alertView.cancelButtonIndex){

        if (alertView.tag == 1)
        {
            //go to URL1
        }

        else if (alertView.tag == 2)
        {
             //go to URL2
        }

        else if (alertView.tag == 3)
        {
            //go to URL3
        }

    }
}
于 2012-09-14T14:23:50.757 に答える
1

UIAlertViewさらにいくつかのプロパティを追跡できるのサブクラスを使用することをお勧めします。私はすべてのプロジェクトでこれを行いますが、はるかに簡単です。

  • これを行う 1 つの解決策は、サブクラス化UIAlertViewしてorMyAlertViewを追加することです。したがって、カスタム データを にアタッチし、デリゲート メソッドで取得して、必要なことを行うことができます。@property(nonatomic, retain) id userInfo;@property(nonatomic, retain) NSURL* urlToOpenUIAlertView
  • もう 1 つの解決策 (実際に私が好む解決策) は、Objective-C ブロックのサポートを に追加して、を使用する代わりにブロック API をUIAlertView使用できるようにすることです。単一のデリゲートを使用して異なるインスタンスを処理するのは混乱するため、これは、同じクラスで同じデリゲートを使用して複数を使用する場合に特に便利です。UIAlertViewdelegateUIAlertViews

私は個人的にこの手法を常に使用しています。ボタンがタップされたときに実行されるコードを、アラートを表示するコードのすぐ隣に配置することで、コードを読みやすくするためです。デリゲート メソッド。

これを既に実装しているOHAlertViewGitHubの私のサブクラスを見ることができます。使い方は非常に簡単で、共通のデリゲートの代わりにアラート ビューごとにブロックを使用できます。以下を参照してください。


使用例

-(void)confirmOpenURL:(NSURL*)url
{
  NSString* message = [NSString string WithFormat:@"Open %@ in Safari?",
                                                  url.absoluteString];
  [OHAlertView showAlertWithTitle:@"Open URL"
                          message:message
                     cancelButton:@"No"
                         okButton:@"Yes"
                   onButtonTapped:^(OHAlertView* alert, NSInteger buttonIndex)
  {
    if (buttonIndex != alert.cancelButtonIndex)
    {
       // If user tapped "Yes" and not "No"
       [[UIApplication sharedApplication] openURL:url];
    }
  }];
}

次に、各ボタンに独自のアクションを設定できます。

-(IBAction)button1Action
{
  [self confirmOpenURL:[NSURL URLWithString:@"http://www.google.com"]];
}
-(IBAction)button2Action
{
  [self confirmOpenURL:[NSURL URLWithString:@"http://www.stackoverflow.com"]];
}

または、URL を開くすべてのボタンに共通の IBAction を設定できます。

-(IBAction)commonButtonAction:(UIButton*)sender
{
   NSUInteger tag = sender.tag;
   NSString* urls[] = { @"http://www.google.com", @"http://www.stackoverflow.com" };
   NSURL* buttonURL = [NSURL URLWithString: urls[tag] ]; // in practice you should check that tag is between 0 and the number of urls to be sure, that's just an example here
   [self confirmOpenURL:buttonURL];
}
于 2012-09-14T13:21:50.857 に答える
0

ボタンアクションメソッドには、次のような署名が必要です。

 -(void)doSomething:(id)sender;

これにより、送信者がボタンになります。これに基づいて、どのURLが意味されているかを知ることができます。

于 2012-09-14T12:55:37.120 に答える