将UIAlertView的按钮点击代理方式改为Block形式

   block类似C语言的函数指针,但Blocks不是一个指针,而是一个不带名字的函数(匿名的代码块)。在这里我就不赘述了,说说将UIAlertView的按钮点击代理方式改为Block形式。代码中定义的全局变量_index与本文主要内容无关,在下一篇,我会详细说明Block的相互引用问题

//控制器ViewController.h文件

 

 1 #import <UIKit/UIKit.h>
 2
 3 @interface ViewController : UIViewController
 4
 5 {
 6     NSInteger _index;
 7 }
 8
 9 @property (nonatomic, assign)NSInteger index;
10
11 @end
#import "ViewController.h"
#import "MyAlerView.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
//在MRC中解决相互引用的问题,用__block 定义一个当前的控制器类型
//相信很多人都对Block是如何相互引用比较关心,分析block在copy全局变量_index是,为了保证其不被销毁,将持有_index属性的对象(viewController)也copy了一份 (注:在这里如果只是将UIAlertView的按钮点击代理方式改为Block形式,没必要关心下面两行代码)  
    __block ViewController *VCblock = self;

    self.index = 90;
    //子类化创建
    MyAlerView *alert = [[MyAlerView alloc]initWithTitle:@"提示" message:@"玩吧" cancelButtonTitle:@"取消" otherButtonTitles:@"确定" clickButton:^(NSInteger index){

        if (index == 1) {
            NSLog(@"确定");

            NSLog(@"%ld",VCblock->_index);

        }

        else if (index == 0)
            NSLog(@"取消");
    }];

    [alert show];

    [alert release];

}

//新建的继承自UIAlertView的类

//MyAlerView.h

#import <UIKit/UIKit.h>
//注(这里的MyBlock是类型名,而不是变量名)
typedef void (^MyBlock)(NSInteger index);

@interface MyAlerView : UIAlertView

@property (nonatomic, copy)MyBlock block;
//构造一个没有代理的初始化方法,并将Myblock类型加上
- (instancetype)initWithTitle:(NSString *)title message:(NSString *)message  cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSString *)otherButtonTitles clickButton:(MyBlock)block;

@end
#import "MyAlerView.h"

@implementation MyAlerView

- (void)dealloc
{
    NSLog(@" 挂掉 ");

    [super dealloc];
}

- (instancetype)initWithTitle:(NSString *)title message:(NSString *)message  cancelButtonTitle:(NSString *)cancelButtonTitle otherButtonTitles:(NSString *)otherButtonTitles clickButton:(MyBlock)block
{
    self = [super initWithTitle:title message:message delegate:self cancelButtonTitle:cancelButtonTitle otherButtonTitles:otherButtonTitles, nil];

    if (self) {

        //确定当前block为传过来的block(注:如果时在MRC这里必须用self.block)
        self.block = block;

    }

    return self;

}
//实现按钮点击事件的协议方法
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    _block(buttonIndex);
}

@end

关于将UIAlertView的按钮点击代理方式改为Block形式,就是这些内容了。

时间: 2024-10-11 19:39:50

将UIAlertView的按钮点击代理方式改为Block形式的相关文章

用block改写UIButton点击事件和UIAlerView的按钮点击代理方法

1.用block改写UIButton点击事件 在这里给给出两种方式. (1)自定义BlockButton,在初始化的时候给出按钮的样式(自定义) 自定义一个BlockButton继承UIButton,然后在里面用 addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents 这个方法触发block. MyBlockButton.h 1 #import <UIKit/UIKit.h>

设置警告框样式为带有两个文本输入的警告框,用于收集用户收货地址和联系电话。并选择合适的代理方法,当警告框上的两输入框有一个为空时限制“购买”按钮点击。

收集购物信息  iOS项目 倒计时:588 步骤 /.panel-heading 项目需求 设置警告框样式为带有两个文本输入的警告框,用于收集用户收货地址和联系电话.并选择合适的代理方法,当警告框上的两输入框有一个为空时限制“购买”按钮点击. #import "TableViewController.h" @interface TableViewController ()<UIAlertViewDelegate> @property (nonatomic, strong)

监听按钮点击事件的三种方式实现及调试信息输出的三种方式实现

监听按钮点击事件的三种方式实现: 1.匿名内部类 2.外部独立类 3.接口实现 package com.example.button; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View;

Objective-C:模拟按钮点击事件理解代理模式

OC中的协议(Protocol)和和.NET中的接口(Interface)类似,简单来讲,就是一系列方法的列表,其中声明的方法可以被任何类实现.不同的是,在.NET中,如果某个类实现了一个接口,就必须实现这个接口中声明的所有方法:但在OC中,可以不实现协议中声明的所有方法,需要用到某些功能,就去实现对应的方法即可. 这种模式一般称为代理模式.在iOS和OS X开发中,Apple采用了大量的代理模式来实现MVC中View(UI控件)和Controller(控制器)的解耦. 监听思想:如果想让某个对

Android中使用4种方式实现按钮点击操作

在Android开发中,对控件的操作是最基本的技术,尤其是对按钮的点击操作.我以下总结了4种按钮点击的实现方式.与大家分享,希望大家批评指正. (1)匿名内部类实现 这种方式是最简单的实现,一般刚开始学习Android或者学习基于用户界面的开发,该方法是必学的.实现代码如下: public class MainActivity extends Activity { private Button button; @Override protected void onCreate(Bundle sa

Android实现Button按钮点击事件监听的几种方式

工作中的项目通常有多个人一起开发,而每个人都有每个人的代码风格,不注重代码规范通常是前人挖坑,后人采坑,降低项目开发效率及加大维护难度,这里分享几种安卓按钮点击事件监听的实现方式. 方式一:直接在Activity中实现View.OnClickListener接口,重写onClick方法,提供所有按钮监听事件入口.这是实际项目中最常用的方式,尤其在页面有多个按钮的情况下比较适用. package com.example.myapp; import android.app.Activity;impo

iOS 通知代理执行代理方式时,代理为nil的解决办法

1.下面代码是描述: 点击Toolbar上的按钮时,通知代理去调代理方法. 1 - (void)didClickedToolbarBtn:(UIButton *)button 2 { 3 4 if ([self.delegate respondsToSelector:@selector(toolbar:didClickedButton:)]) { 5 [self.delegate toolbar:self didClickedButton:button.tag]; 6 } 7 self.sele

在自定义的tabbar 中间按钮 点击出现一个view 再点击view返回

入职第三天 遇到一个小问题 记下来 问题是自定义的tabbar 中间一个加号按钮 点击从下弹出一个view,再点击 view返回 首先再tabbar的view .h添加一个代理方法 在.m中 在tabbar的VC.m中实现代理方法( 我是在这里加了一个判断 反正实现了 菜鸟的做法吧,不加判断 点击回不去) 创建view的V和C 在V中 添加一个单例类 创建了view的坐标 在V.m中 创建好view的show 和dismiss 两个方法 这样大功告成了 中间还有一些细节 我也不知道怎么说 dis

Android Day01-Android按钮点击事件的4种写法

按钮点击事件,说白了就一个方法,setOnClickListener(OnClickListener). 只要传递的参数只要是OnClickListener接口的子类即可,很容易想到的2种实现方式就是匿名内部类和定义一个类实现这个接口.另外还有2种实现方法,有必要着重讲一下: 1.让Activity自身实现OnClickListener接口,传递setOnClickListener参数用this. 然后在onClick(View v)方法中,判断事件源id. switch(v.getId())