UIAlertView 和 UIAlertController 都可以实现弹框的效果,但是在iOS 8之后,推荐使用UIAlertController,接下来我们就探讨一下,它们之间使用的异同点。
需求:在工作中经常会遇到点击UITableViewCell的某一行,弹出一个框,然后修改里面的内容
实现:
1>使用UIAlertController
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
<pre name="code" class="objc"> //1.取出这一行的模型数据
WTHeroModel * model = self.heroArray[indexPath.row];
//2.取得模型数据的名称
NSString * heroName = model.name;
//3.实例化UIAlertController
UIAlertController * alertController = [UIAlertController alertControllerWithTitle:@"编辑" message:@"请输入要修改的内容" preferredStyle:UIAlertControllerStyleAlert];
//4.给UIAlertController添加一个textField
[alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
//给textField赋值
textField.text = heroName;
}];
//5.显示UIAlertController
[self presentViewController:alertController animated:YES completion:nil];
//6.添加确定,取消按钮
UIAlertAction * CancelAction = [UIAlertAction actionWithTitle:@"取消" style: UIAlertActionStyleCancel handler:nil];
[alertController addAction:CancelAction];
UIAlertAction * sureAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
UITextField * txtFields = [alertController.textFields lastObject];
//修改模型数据
model.name = txtFields.text;
//7.刷新表格
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft];//单行刷新
<span style="white-space:pre"> </span>//[self.tableView reloadData]; 全部刷新
}];
[alertController addAction:sureAction];
}
2>使用UIAlertView
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
//1.取出模型
WTHeroModel * model = self.heroArray[indexPath.row];
//2.取出英雄名称
NSString * name = model.name;
//3.实例化弹框
UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@" 编辑" message:@"<span style="font-family: Arial, Helvetica, sans-serif;">请输入要修改的内容</span><span style="font-family: Arial, Helvetica, sans-serif;">" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];</span>
/**
<p style="margin-top: 0px; margin-bottom: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"><span style="color:#ff0000;"> UIAlertViewStyleDefault = 0, 默认</span></p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"><span style="color:#ff0000;"> UIAlertViewStyleSecureTextInput, 密码输入</span></p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"><span style="color:#ff0000;"> UIAlertViewStylePlainTextInput, 文本框</span></p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 11px; line-height: normal; font-family: Menlo;"><span style="color:#ff0000;"> UIAlertViewStyleLoginAndPasswordInput 账号,密码输入</span></p>
*/
alert.alertViewStyle = UIAlertViewStylePlainTextInput;
//4.添加文本框
UITextField * field = [alert textFieldAtIndex:0];
alert.tag = indexPath.row;
field.text = name;
[alert show];
}
遵守UIAlertView协议,实现协议中的方法<UIAlertViewDelegate>
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex == 1) {
//取得修改后的值
UITextField * field = [alertView textFieldAtIndex:0];
NSString * name = <span style="font-family: Arial, Helvetica, sans-serif;">field</span>.text;
WTHeroModel * model = self.array[alertView.tag];
model.name = name;
//刷新数据
NSIndexPath * indexPath = [NSIndexPath indexPathForRow:alertView.tag inSection:0];
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft];
<span style="white-space:pre"> </span>}
}
两种方法都可以实现,第一种使用的是block,第二种是用的是代理,个人感觉还是block使用的比较顺手一些。