小一時間ハマってました。
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表示処理
といった感じで記述することで思い通りの動作となりました。
参考にしたサイト
UIActionSheetでもOKでした。大変参考になりました。