这是一对简短的类别,用于 UIAlertView 和 UIActionSheet,使您可以使用块来处理按钮选择,而不是实现代理。
在这里以 UIAlertView 作为主示例,而不是调用传统的 -initWithTitle:message:delegate:cancelButtonTitle:otherButtonTitles:
构造函数,您调用新的构造函数:-initWithTitle:message:cancelButtonItem:otherButtonItems:
。这个构造函数的工作方式与传统的构造函数相同,只是使用按钮字符串,它接受 RIButtonItem 的实例。这也是本框架定义的一个类,它简单地封装按钮标签和当按钮被点击时要执行的操作块。构造函数的最后一个参数是可变的,就像传统的构造函数一样,因此必须是 nil
终止的。
动作块是 RISimpleAction 类型,被 typedef 到以下块
typedef void (^RISimpleAction)();
这是一个只接收无参数并返回无的简单块。
RIButtonItem 类还提供了一个方便的方法,返回一个名为 +item
的自释放项。如果您不指定操作,按钮仍然会显示,但在点击时不会做任何事,只会关闭对话框。这与取消按钮非常常见,因此另一个方便的方法 +itemWithLabel:
允许您快速创建没有操作的项。
在背后,类别接收您传递的按钮项,并将其作为关联对象存储在 UIAlertView 本身中。然后,它初始化一个传统的 UIAlertView,并将自己设置为目标代理。当 UIAlertView 被调用 -alertView:didDismissWithButtonIndex:
代理方法时,它取出按钮项,查找与点击按钮关联的项,并执行与该按钮关联的块。
你可能很好奇的一个小问题:在初始化器中,它会保留自己。这样做的原因是,预期你会基本上设置好后就不理它了。我不想为这个家伙保留一个实例变量,而且我也不确定`didDismiss`方法是在`alertView`从视图层次中删除之前还是之后调用的,所以我们可能会对已经分配的对象进行操作。因为`UIAlertView`本身有自己的代理,如果在调用`didDismiss`方法之前就被回收了,程序就会崩溃,我们当然不希望这样发生。通过保留`self`,我们就不必担心这个问题。唯一需要注意的是,我们必须记得在代理方法中释放`self`,我们确实这么做了。如果有人可以确认或否认这段代码是必须的,我希望进行讨论。保留`self`让我感觉很不道德?是的。还有点调皮……哎呀……真的很调皮…… ;)
通常,你将创建代表按钮的项目,以及当按钮被点击时要执行的动作。例如,想象一个确认删除项目的对话框
RIButtonItem *cancelItem = [RIButtonItem itemWithLabel:@"No" action:^{
// this is the code that will be executed when the user taps "No"
// this is optional... if you leave the action as nil, it won't do anything
// but here, I'm showing a block just to show that you can use one if you want to.
}];
RIButtonItem *deleteItem = [RIButtonItem itemWithLabel:@"Yes" action:^{
// this is the code that will be executed when the user taps "Yes"
// delete the object in question...
[context deleteObject:theObject];
}];
按钮元素的`label`属性就是要显示在按钮上的文本。
一旦创建了这些,你可以使用初始化器初始化`UIAlertView`,相应地传递你的按钮元素。
UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Delete This Item?"
message:@"Are you sure you want to delete this really important thing?"
cancelButtonItem:cancelItem
otherButtonItems:deleteItem, nil];
[alertView show];
另外,你也可以用一行代码创建按钮并声明alert view
[[[UIAlertView alloc] initWithTitle:@"Delete This Item?"
message:@"Are you sure you want to delete this really important thing?"
cancelButtonItem:[RIButtonItem itemWithLabel:@"Yes" action:^{
// Handle "Cancel"
}]
otherButtonItems:[RIButtonItem itemWithLabel:@"Delete" action:^{
// Handle "Delete"
}], nil] show];
再次强调,这是设计为“设置后忘掉”的,所以你可以初始化它,显示它,然后释放它。它会自己清理。
你还可以在初始化后向`UIAlertView`添加`RIButtonItem`,就像你通常做的那样
[alertView addButtonItem:deleteItem];
这在对`UIAlertView`或`UIActionSheet`动态从数组中创建时很有用
for (RIButtonItem *item in buttonItemArray) {
[alertView addButtonItem:item];
}
就这些!
`UIActionSheet`类别几乎与`UIAlertView`相同。只需查看所需的初始化器头部即可。非常简单。
为什么不买我一杯比特币啤酒呢?
我的钱包地址是:1JtjkQFmJmbMumWquh5J2fuRuD6LkWr5QL
版权所有 (C) 2011-2014 Random Ideas, LLC
以下授予任何获取本软件及其相关文档文件(“软件”)副本的人自由使用的许可,不受限制,包括但不限于使用、复制、修改、合并、出版、分发、再许可和/或出售软件副本的权利,以及允许向提供软件的人进行此类处理的权利。
软件按“现状”提供,不提供任何明示或暗示的保证,包括但不限于适销性、适用于特定用途和侵权不承担责任。在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任承担法律责任,无论这些责任是源于合同、侵权或其他行为,无论是由于软件或其使用或其他方式,还是与软件有关。