UIAlertView-Blocks 1.0

UIAlertView-Blocks 1.0

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发行最后发行2014年12月

未声明维护。



  • 作者
  • Jiva Devoe

README

这是一对简短的类别,用于 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

Wallet QR Code

许可协议

版权所有 (C) 2011-2014 Random Ideas, LLC

以下授予任何获取本软件及其相关文档文件(“软件”)副本的人自由使用的许可,不受限制,包括但不限于使用、复制、修改、合并、出版、分发、再许可和/或出售软件副本的权利,以及允许向提供软件的人进行此类处理的权利。

软件按“现状”提供,不提供任何明示或暗示的保证,包括但不限于适销性、适用于特定用途和侵权不承担责任。在任何情况下,作者或版权持有人均不对任何索赔、损害或其他责任承担法律责任,无论这些责任是源于合同、侵权或其他行为,无论是由于软件或其使用或其他方式,还是与软件有关。