2016-09-23 14:24:14 yinbingbing123456 阅读数 249

我们平常写代码的时候,经常会用到类目与延展,用起来都很方便,这里简单讨论一下我对这两种方式的理解。

我们用XCODE创建NEW FILE的时候通常有以下四种:

1.标准的类文件(a.h 和a.m)

2.协议类文件Protocol (protocol.h),没有.m文件

3.类别文件,假设原有类a,(a+b.h文件a+b.m文件,声明并实现了方法d)

4.延展文件,假设原有类a,(a_b.h,声明了方法d),没有.m文件


如下图所示:



实际用的时候,对于类别Category来说,假设有一个view controller类,导入了a+b.h,那么可以直接调用方法d,且方法d在a+b.m中实现了,已经写死,不能再当前类里面重写这个方法;对于延展extesion来说,view controller类,导入了a_b.h,当前的vc可以对方法d进行在定义的实现(个人理解),话说回来,我觉得延展并没有什么卵用,没有觉得有多大的代码维护与便利的作用,欢迎大家补充指正,谢谢!



相关链接:http://blog.csdn.net/smking/article/details/39009575/


2016-02-03 13:41:08 u013255127 阅读数 253

OC类的声明与实现

在ios开发中,使用的各种方法都是来自于不同的类,学习oc语言,类的使用更为基础。
在写代码之前,我们先得了.h文件和.m文件分别代表什么含义。
.h是声明文件,声明我们即将创建的类的属性,方法
.m是实现文件,实现我们在声明文件中所定义的方法  .m文件可以用c或者oc编写

我们新建一个Student类
Student.h
#import <Foundation/Foundation.h>

@interface Student : NSObject{
    NSString *name;
    int age;
}

-(void)say;

@end

Student.m
#import "Student.h"

@implementation Student

-(void)say{
    NSLog(@"hell");
}

@end

使用我们创建的Studentl类
#import <Foundation/Foundation.h>
#import "Student.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Student *s = [[Student alloc] init];
        [s say];
        
    }
    return 0;
}


我们可以看到,初始化Student的代码
 Student *str = [[Student alloc] init];
我们可以把这部分代码分为三个部门:
Student *str  使用Student ,创建一个指针str 
[Student alloc]  使用alloc为Student申请使用内存
init  初始化Student
这样,我们实例化一个Student

2014-10-18 12:36:35 miaocuilin 阅读数 2675

我是将聊天记录存到本地,里边用到了自定义的对象,把数据转成Data格式存到本地,在转Data格式的时候报错了,这时候需要先将自定义对象进行归档才可以转Data格式。方法如下:


一、在.h文件中声明<NSCoding>协议











二、在.m文件中实现encodeWithCoder和intiWithCoder方法



归档之后就把对象存储到字典或数组里,转成Data格式的,再存储到本地即可。

关于怎么把字典转成Data格式参见我的另一篇文章:

地址:http://blog.csdn.net/miaocuilin/article/details/40210281。

2016-03-21 11:52:28 u014220518 阅读数 1044



1、代理传值



A \B 两个页面需要将B页面的值传个A


总结:


1.首先应该在b页面写一个协议,协议里有带参数的方法,并创建实现该协议的属性delegate,然后判断该delegate_ 是否实现了协议的方法,实现该协议方法,并传入值。

2.A.h 文件里声明协议,并在A.m文件里实现协议方法


例如:

B.h


//声明协议

@protocol Senvalue <NSObject>


-(void)sendname:(NSString *)name;

-(void)sendpass:(NSString *)pass;

@end


@interface ViewController : UIViewController

@property (weak, nonatomic) IBOutlet UITextField *nametext;

@property (weak, nonatomic) IBOutlet UITextField *password;


- (IBAction)regester:(UIButton *)sender;//按钮事件

@property (nonatomic,assign)id <Senvalue> delegate;


@end


B.m


#import "ViewController.h"


@interface ViewController ()

@end

@implementation ViewController


@synthesize delegate = delegate_;


-IBAction)regester:(UIButton *)sender

{

    NSString *name1 = self.nametext.text;

    NSString *pass1 = self.password.text;

    if([delegate_ respondToSelector :@selector(sendname:)]&&[delegate_ respondToSelector:@selector(sendpass:)])

    {

        [delegate_ sendname:name1];

        [delegate_ sendpass:pass1];


    [self.navigationController popToRootViewControllerAnimated:YES];

    }

}



A.h


#import <UIKit/UIKit.h>

#import "ViewController.h"

@interface RootViewController : UIViewController <SenValue> //实现了B的协议

@property (weak, nonatomic) IBOutlet UITextField *NameText;

@property (weak, nonatomic) IBOutlet UITextField *PassWord;

- (IBAction)Sender:(UIButton *)sender;


@end


A.m

/**

 主要实现了B协议的方法

 */

-(void)sendname:(NSString *)name

{

    _NameText.text =name;

    NSLog(@"%@....",_NameText.text);

}

-(void)sendpass:(NSString *)pass

{

    _PassWord.text =pass;

    NSLog(@"%@....",_PassWord.text);

}



2.block 传值


A \B 两个页面需要将B页面的值传个A


总结:

1.首先在b.h文件中声明一个字符串指针函数:typedef void(^PostString)(NSString *str)),然后声明一个该指针函数的属性,用该属性传值,


2.A.m 文件中创建B的对象,用该对象实现block;


B.h


#import <UIKit/UIKit.h>

@interface DemoViewController : UIViewController


typedef void (^ PostString)(NSString *str); //声明一个字符串指针函数

@property (nonatomic,copy)PostString mblock;


@end


B.m


#import "DemoViewController.h"



@interface DemoViewController ()

@end

@implementation DemoViewController


-(void)touchesEnded:(NSSet *)touches withEnent:(UIEvent *)event

{

    NSLog (@"反向传值")

    if (self.mblock) {

        self.mblock(@"Test");

    }

}


A.m


#import "QFViewController.h"

#import "DemoViewController.h"

@interface QFViewController ()

@end

@implementation QFViewController


-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

{

    DemoViewController *ctl = [[DemoViewController alloc]init];

    ctl.mblock = ^(NSString *str){

        NSLog(@"接收到DemoViewController 传递过来的: %@",str);


}


    

3.单例传值

    

    AppStatus.h  创建一个单例类 AppStatus

    

#import <Foundation/Foundation.h>

@interface AppStatus : NSObject

{

    NSString *_contextStr;

}

@property(nonatomic,retain)NSString *contextStr;

+(AppStatus *)shareInstance;

@end

    

AppStatus.m

    #import "AppStatus.h"

    @implementation AppStatus

    @synthesize contextStr = _contextStr;

    static AppStatus *_instance = nil;

    

    +(AppStatus *)shareInstance

    {

        if (_instance == nil)

        {

            _instance = [[super alloc]init];

        }

        return _instance;

    }

    -(id)init

    {

        if (self = [super init])

        {

            

        }

        return  self;

    }

    

    -(void)dealloc

    {

        [super dealloc];

    }

    

    @end

    

    A页面RootViewController.h

    

#import "RootViewController.h"

#import "DetailViewController.h"

#import "AppStatus.h"

    

    @interface RootViewController ()

    

    @end

    

    @implementation RootViewController

    -(void)loadView

    {

        //核心代码

        UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];

        btn.frame = CGRectMake(0, 0, 100, 30);

        [btn setTitle:@"Push" forState:0];

        [btn addTarget:self action:@selector(pushAction:) forControlEvents:UIControlEventTouchUpInside];

        [self.view addSubview:btn];

    }

    

    -(void)pushAction:(id)sender

    {

        

        tf = (UITextField *)[self.view viewWithTag:1000];

        

        //单例传值  将要传递的信息存入单例中(共享中)

        //  [[AppStatus shareInstance]setContextStr:tf.text]; 跟下面这种写法是等价的

        [AppStatus shareInstance].contextStr = tf.text;

        //导航push到下一个页面

        //pushViewController 入栈引用计数+1,且控制权归系统

        DetailViewController *detailViewController = [[DetailViewController alloc]init];

        

        //导航push到下一个页面

        [self.navigationController pushViewController:detailViewController animated:YES];

        [detailViewController release];

    }

    @end

    

    B页面DetailViewController.h

    

#import <UIKit/UIKit.h>

    @protocol ChangeDelegate;//通知编译器有此代理

    

    @interface DetailViewController : UIViewController

    {

        UITextField *textField;

    }

    @end


    B页面DetailViewController.m

#import "DetailViewController.h"

#import "AppStatus.h"

    

    @interface DetailViewController ()

    

    @end

    

    @implementation DetailViewController

    @synthesize naviTitle = _naviTitle;

    

    -(void)loadView

    {

        self.view = [[[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)]autorelease];

        

        //单例

        self.title = [AppStatus shareInstance].contextStr;

 

        textField = [[UITextField alloc]initWithFrame:CGRectMake(100, 100, 150, 30)];

        textField.borderStyle = UITextBorderStyleLine;

        [self.view addSubview:textField];

        [textField release];

        

        UIBarButtonItem *doneItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDonetarget:self action:@selector(doneAction:)];

        self.navigationItem.rightBarButtonItem = doneItem;

        [doneItem release];

        

    }

    

    //这个方法是执行多遍的  相当于刷新view

    -(void)viewWillAppear:(BOOL)animated

    {

        [super viewWillAppear:animated];

        

        tf = (UITextField *)[self.view viewWithTag:1000];

        tf.text = [AppStatus shareInstance].contextStr;

        

    }

    //pop回前一个页面

    -(void)doneAction:(id)sender

    {

        //  单例传值

        [AppStatus shareInstance].contextStr = textField.text;

        [self.navigationController popToRootViewControllerAnimated:YES];

    }


4.通知传值 谁要监听值的变化,谁就注册通知  特别要注意,通知的接受者必须存在这一先决条件

    

    

    A页面RootViewController.h

#import <UIKit/UIKit.h>

#import "DetailViewController.h"

    

    @interface RootViewController : UIViewController<ChangeDelegate>

    {

        UITextField *tf;

    }

    @end

    

    A页面RootViewController.m

    

#import "IndexViewController.h"

#import "DetailViewController.h"

#import "AppStatus.h"

    

    

    @implementation IndexViewController

    

    -(void)dealloc

    {

        [[NSNotificationCenter defaultCenter] removeObserver:self

                                                        name:@"CHANGE_TITLE" object:nil];

        [super dealloc];

    }

    

    -(id)init

    {

        if (self = [super init])

        {

            [[NSNotificationCenter defaultCenter] addObserver:self

                                                     selector:@selector(change:)

                                                         name:@"CHANGE_TITLE"

                                                       object:nil];

        }

        return self;

    }

    

    -(void)change:(NSNotification *)aNoti

    {

        // 通知传值

        NSDictionary *dic = [aNoti userInfo];

        NSString *str = [dic valueForKey:@"Info"];

        

        

        UITextField *tf =  (UITextField *)[self.view viewWithTag:1000];

        tf.text = str;

    }

    

    

    -(void)viewWillAppear:(BOOL)animated

    {

        [super viewWillAppear:animated];

        

        /*

         // 单例传值

         UITextField *tf =  (UITextField *)[self.view viewWithTag:1000];

         tf.text = [AppStatus shareInstance].contextStr;

         */

    }

    @end

    

    DetailViewController.h

    

#import <UIKit/UIKit.h>

    @protocol ChangeDelegate;//通知编译器有此代理

    

    @interface DetailViewController : UIViewController

    {

        UITextField *textField;

    }

    @end

    

    DetailViewController.m

    

#import "DetailViewController.h"

#import "AppStatus.h"

    

    

    @implementation DetailViewController

    @synthesize naviTitle = _naviTitle;

    

    -(void)loadView

    {

        

        UIBarButtonItem *doneItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDonetarget:self action:@selector(doneAction:)];

        self.navigationItem.rightBarButtonItem = doneItem;

        [doneItem release];

    }

    // pop回前一个页面

    -(void)doneAction:(id)sender

    {

        

        NSDictionary *dic = [NSDictionary dictionaryWithObject:textField.text forKey:@"Info"];

        

        [[NSNotificationCenter defaultCenter] postNotificationName:@"CHANGE_TITLE" object:nil userInfo:dic];

        

        [self.navigationController popViewControllerAnimated:YES];

        

    }



2015-09-08 14:50:18 yejiajun945 阅读数 273
1.在对象B的.h文件中定义一个@protocol代理协议,并声明代理方法,且第一个参数为所有者
2.在对象B的.h文件中声明一个代理协议的属性变量:@propety id<xxxdelegate> delegate;
3.让对象B在适当的时候向代理对象发送消息,执行代理方法。
4.让对象A遵从代理协议,在.h文件中的@interface声明部分添加一个尖括号包含协议,并在.m文件中实现协议的全部方法。
5.通知对象b,对象a现在是它的代理,在prepareForSegue方法中实现。

iOS中的延展和协议

阅读数 622

没有更多推荐了,返回首页