私は、Kendallの答えとベースビューコントローラクラスの1つのブロックの使い方をミックスしました。今では、読みやすさを大幅に向上させるブロックを持つAlertViewとActionSheetsを使用できます。ここで私はそれをやった方法です:
。私のViewControllerの時間、私は(任意ですがrecommanded)ブロックタイプを宣言
typedef void (^AlertViewBlock)(UIAlertView*,NSInteger);
また、私は、各alertviewのためのブロックを格納する可変dictionnaryを宣言:実装ファイルで
NSMutableDictionary* m_AlertViewContext;
私が追加します
-(void)displayAlertViewWithTitle:(NSString *)title message:(NSString *)message cancelButtonTitle:(NSString *)cancelButtonTitle withBlock:(AlertViewBlock)execBlock otherButtonTitles:(NSArray *)otherButtonTitles
{
UIAlertView* alert = [[UIAlertView alloc] initWithTitle:title
message:message
delegate:self cancelButtonTitle:cancelButtonTitle otherButtonTitles: nil];
for (NSString* otherButtonTitle in otherButtonTitles) {
[alert addButtonWithTitle:otherButtonTitle];
}
AlertViewBlock blockCopy = Block_copy(execBlock);
[m_AlertViewContext setObject:blockCopy forKey:[NSString stringWithFormat:@"%p",alert]];
Block_release(blockCopy);
[alert show];
[alert release];
}
注私はUIAlertViewのコンストラクタはなくなりますデリゲート(sと同じ属性を受信します。方法は、ブロックをAlertViewを作成し、保存しますエルフ)。また、私は、m_AlertViewContext可変ディクショナリに保存するAlertViewBlockオブジェクトを受け取ります。 それから私は通常と同じように警告を表示します。
[self displayAlertViewWithTitle:@"Title"
message:@"msg"
cancelButtonTitle:@"Cancel"
withBlock:^(UIAlertView *alertView, NSInteger buttonIndex) {
if ([[alertView buttonTitleAtIndex:buttonIndex] isEqualToString:@"DO ACTION"]){
[self doWhatYouHaveToDo];
}
} otherButtonTitles:[NSArray arrayWithObject:@"DO ACTION"]];
I:私はAlertViewを使用する必要がある時はいつでも、私はこのようにそれを呼び出すことができ、今
#pragma mark -
#pragma mark UIAlertViewDelegate
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
NSString* blockKey = [NSString stringWithFormat:@"%p",alertView];
AlertViewBlock block = [m_AlertViewContext objectForKey:blockKey];
block(alertView,buttonIndex);
[m_AlertViewContext removeObjectForKey:blockKey];
}
- (void)alertViewCancel:(UIAlertView *)alertView {
NSString* blockKey = [NSString stringWithFormat:@"%p",alertView];
[m_AlertViewContext removeObjectForKey:blockKey];
}
:デリゲートのコールバックで
、私はパラメータをブロックを呼び出し、それを与えますActionSheetのために同じことをしました、そして、今それらを使用することは本当に簡単です。 お手伝いをしてください。
"アドレスは電話で一定でなければなりません" - このようなアドレスはオブジェクトへのポインタであり、一定のままでは使用できません。あなたの答えの残りは分かりやすいです、私はちょうど誰かがこのページに上陸した場合に備えて、これを将来の参考のために指摘したかったのです。 – Morpheu5