iPhoneアプリでUIActionSheetを使用している間、アクションをボタンに一致させる一般的な方法は非常に壊れやすく、見た目にも不快に見えます。おそらくそれは私の最小限のC/C ++バックグラウンド(より多くのPerl、Java、Lispなど)によるものです。ボタンインデックスの一致は、単純な論理エラーまたは整合性エラーを回避するには、マジックナンバーが多すぎて接続が切断されているように見えます。
例えば、
UIActionSheet *sources = [[UIActionSheet alloc]
initWithTitle:@"Social Networks"
delegate:self
cancelButtonTitle:@"Cancel"
destructiveButtonTitle:nil
otherButtonTitles:@"Twitter", @"Facebook", @"Myspace", @"LinkedIn", @"BlahBlah", nil
];
<snip>
-(void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex {
if (buttonIndex == [actionSheet cancelButtonIndex]) {
// all done
} else if (buttonIndex == 0) {
// Twitter
} else if (buttonIndex == 1) {
// Facebook
} else if (buttonIndex == 2) {
// LinkedIn
} else if (buttonIndex == 3) {
// Myspace
}
}
アクション処理コードに少なくとも2つのエラーがあることに注意してください(少なくともコメントによると)。
私が見逃しているのは、Objective-Cでその切断を回避するための正しいデザインパターンです。これがperlの場合、最初にボタンオプションの配列を作成し、次に各アイテムに適切な処理を行うオブジェクトまたはサブルーチンの別のルックアップテーブルに対応するクイックルックアップテーブルハッシュを作成します。Javaでは、元のリストはおそらく最初にコールバックを持つオブジェクトになります。Perlハッシュを模倣する辞書を作成できることは知っていますが、3〜4個のオプションでは非常に扱いにくく面倒です。インデックスの魔法性を隠すために列挙型を使用することも検討しましたが、それは問題のごく一部にすぎません。
本当の問題は、ボタン文字列のリストと対応するアクションの両方を1つの場所で指定する(簡単な?)方法がないため、オプションを追加/削除/並べ替えるときに2つの場所でコードを変更する必要がなくなり、効果的に作成できることです。私のサンプルコードが犯すような間違いを犯すことは不可能です。
私はプログラミング言語の聖戦を始めようとはしていません。ボタン文字列のリストをアクションのリストに接続するためのこのシナリオ(およびObjective Cの他の多くのシナリオ)の正しいデザインパターンを理解したいだけです。