1つのViewから複数のUIActionSheet→UIAlertViewを出す時の注意

小一時間ハマってました。

UIActionSheetのボタンが押されるとUIAlertViewを表示するようにしていたのですが、1つのViewに複数のUIActionSheetがあってそれぞれUIAlertViewを表示するようにすると、そのままでは同じUIAlertViewが表示されてしまします。

UIActionSheetのボタンが押されたときに下記のメソッドでボタン番号(0.1.2…)が受け取れます。

– (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{

その中にAlertViewを書いています。

ソースコードはこんな感じ
UIActionSheet

– (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
switch (indexPath.section) {
case 2:
switch (indexPath.row) {
case 0:
{ //UIActionSheet
UIActionSheet *Reset_tabs = [[[UIActionSheet alloc] initWithTitle:NSLocalizedString(@”錠剤数の設定を初期化しますか?”,@””)
delegate:self
cancelButtonTitle:NSLocalizedString(@”Cancel”,@””)
destructiveButtonTitle:NSLocalizedString(@”YES”,@””)
otherButtonTitles:nil] autorelease];
//showInView:self.view だと、TabBarが表示されている部分のアクションシートボタンが反応しない。
[Reset_tabs showInView:super.tabBarController.view];
break;

}
break;
case 1:
{ //switchのなかでアラートなどを用いる場合には括弧が必要。
//UIActionSheet
UIActionSheet *Settings_action = [[[UIActionSheet alloc] initWithTitle:NSLocalizedString(@”非表示にしたメッセージを再度表示しますか?”,@””)
delegate:self
cancelButtonTitle:NSLocalizedString(@”Cancel”,@””)
destructiveButtonTitle:NSLocalizedString(@”YES”,@””)
otherButtonTitles:nil] autorelease];
//showInView:self.view だと、TabBarが表示されている部分のアクションシートボタンが反応しない。
[Settings_action showInView:super.tabBarController.view];
break;
}
default:
break;
}
break;
default:
break;
}
}

UIAlertView

– (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{
switch (buttonIndex) {
case 0:
{
[Setting setBool:YES forKey:@”AlertTab”];
[Setting setBool:YES forKey:@”AlertCCr”];
[Setting synchronize];

UIAlertView *message_re_show = [[[UIAlertView alloc] initWithTitle:NSLocalizedString(@”メッセージの再表示”,)
message:NSLocalizedString(@”次回起動時からメッセージが再表示されます。”,)
delegate:self
cancelButtonTitle:NSLocalizedString(@”了解”,)
otherButtonTitles:nil] autorelease];

[message_re_show show];
break;
}
default:

break;
}
}

このままではどちらのアクションシートからも同じAlertが表示されてしまいます。

そこで
#define 定義を用いて場合分けします。
actionType はヘッダーでintで定義しています。

.mファイルに

#define ActionSheetType_A 0
#define ActionSheetType_B 1

と書いておきます。

– (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
switch (indexPath.section) {
case 2:
switch (indexPath.row) {
case 0:
{ //UIActionSheet
actionType = ActionSheetType_A;
UIActionSheet *Reset_tabs = [[[UIActionSheet alloc] initWithTitle:NSLocalizedString(@”錠剤数の設定を初期化しますか?”,@””)
delegate:self
cancelButtonTitle:NSLocalizedString(@”Cancel”,@””)
destructiveButtonTitle:NSLocalizedString(@”YES”,@””)
otherButtonTitles:nil] autorelease];
//showInView:self.view だと、TabBarが表示されている部分のアクションシートボタンが反応しない。
[Reset_tabs showInView:super.tabBarController.view];
break;

}
break;
case 1:
{ //switchのなかでアラートなどを用いる場合には括弧が必要。
//UIActionSheet
actionType = ActionSheetType_B;
UIActionSheet *Settings_action = [[[UIActionSheet alloc] initWithTitle:NSLocalizedString(@”非表示にしたメッセージを再度表示しますか?”,@””)
delegate:self
cancelButtonTitle:NSLocalizedString(@”Cancel”,@””)
destructiveButtonTitle:NSLocalizedString(@”YES”,@””)
otherButtonTitles:nil] autorelease];
//showInView:self.view だと、TabBarが表示されている部分のアクションシートボタンが反応しない。
[Settings_action showInView:super.tabBarController.view];
break;
}
default:
break;
}
break;
default:
break;
}
}

その後に

– (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{
switch (actionType) {
case 0:
switch (buttonIndex) {
case 0:
{ //UIAlertView表示処理

といった感じで記述することで思い通りの動作となりました。

参考にしたサイト

一つのビューから複数のUIAlertViewを使った制御|静岡県富士市在住のiPhoneアプリ開発者ブログ

UIActionSheetでもOKでした。大変参考になりました。

スポンサーリンク

フォローする