码迷,mamicode.com
首页 > 其他好文 > 详细

知识点5

时间:2016-05-05 10:59:58      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:

因为是自定义的组件所以storyboard我们就用不了啦,所有的代码都必须手写,这样才能保证组件使用的灵活性和减少各个组件之间的耦合性,更利于团队之间的合作。在封装组件时要预留好外界可能使用到的接口,和返回该返回的数据。

 

 

- (instancetype)init

  {

      self = [super init];

      if (self) {

 

 

      }

      return self;

  }

 

 

//把使用过的图片存入sqlite

         NSData *imageData = UIImagePNGRepresentation(image);

          [copy_self.imageMode save:imageData ImageText:imageText];

 

 

 

 

@property (nonatomic,readwrite) CLLocationCoordinate2D coordinate;

 

 

CocoaPods应该是iOS最常用最有名的类库管理工具了,可以用来方便的统一管理这些第三方库。

安装CocoaPods需要Ruby环境

Mac  OS本身自带Ruby,但还是更新一下保险,

 
 

APP目录: AppDelegate  这个目录下放的是AppDelegate.h(.m)文件,是整个应用的入口文件,所以单独拿出来。

                   Macro这个目录下放了整个应用会用到的宏定义,

Macro

    |- AppMacro.h: app相关的宏定义

    |- NotificationMacro.h:放的是通知相关的宏定义

    |- VendorMacro.h:放一些第三方常量

    |- UtilsMacro.h:放的是一些方便使用的宏定义

 

Vendors这个目录放第三方的类库/SDK

Resources这个目录下放的是app会用到的一些资源,主要是图片

 

 

KVO是实现Cocoa Bindings的基础,它提供了一种方法,当某个属性改变时,相应的objects会被通知到  这是怎么实现的呢?其实这都是通过Objective-C强大的运行时(runtime)实现的

 

 

运行时(runtime):

- (void)parseObject:(id)object {

    for (id data in object) {

        if ([[data type] isEqualToString:@"String"]) {

            [self parseString:[data value]]; 

        } else if ([[data type] isEqualToString:@"Number"]) {

            [self parseNumber:[data value]];

        } else if ([[data type] isEqualToString:@"Array"]) {

            [self parseArray:[data value]];

        }

    }

}

- (void)parseObjectDynamic:(id)object {

    for (id data in object) {

        [self performSelector:NSSelectorFromString([NSString stringWithFormat:@"parse%@:", [data type]]) withObject:[data value]];

    }

}

- (void)parseString:(NSString *)aString {}

- (void)parseNumber:(NSString *)aNumber {}

- (void)parseArray:(NSString *)aArray {}

 

 

方法由两个部分组成。Selector相当于一个方法的id;IMP是方法的实现。这样分开的一个便利之处是selector和IMP之间的对应关系可以被改变。比如一个 IMP 可以有多个 selectors 指向它。 IMP 是一个指向方法实现的指针

 

能让我们使用block作为 IMP,下面这个代码片段展示了如何使用block来添加新的方法。

IMP myIMP = imp_implementationWithBlock(^(id _self, NSString *string) {

    NSLog(@"Hello %@", string);

});

class_addMethod([MYclass class], @selector(sayHello:), myIMP, "v@:@");

 

 

Core Graphics是一组用来绘制2D图形的API

Core Animation包含于QuartzCore.framwork中,是一组自由度更大的图形绘制和动画API,

Core Image是一组用于图像、视频处理的API,如添加滤镜之类的。

 

iOS中,所有的UIView都自带了一个CALayer(可以通过UIView.layer访问),UIView的渲染和动画最终也是通过layer来实现的。从这个意义上说,UIView就是简单的一层壳,把图形绘制需要的信息传递给layer。当然UIView还有一个重要的功能就是处理事件,如点击按钮,滑动等等。

所以一般的动画view animation都可以应付。

 

重点就是模块化编程 多用组合,少用继承;模块化编程好处:只要接口是对的,且功能也正常,每个模块只要完成自己的功能就行了,出了问题,也只需要调整某一个模块,而不用担心会引发其他模块功能的异常。

 

模块之间是互盲的,A模块不需要知道B模块的存在,更不能依赖B模块,这样才能解耦(话虽如此,实际上经常会自然不自然地与某个模块发生耦合)。模块只需要提供接口供母体使用就行了。当然在特定事件发生时,还需要通知母体,这就需要用到delegate。

 

使用继承会使架构变得复杂,为了保证每个类都只有自己需要的方法,需要很小心地定义public / protected / private方法,尤其是对父类地改动更需小心,这种架构很难应对多变的环境。

 

使用组合可以让每一个模块专注于自己地功能,按需使用,模块的调整只要不影响接口,爱怎么折腾就怎么折腾,提升了自由度。

 

不过组合也是有副作用的,尤其是涉及到子模块,比如上面的BallComponent,需要重新定义一遍接口,而继承的话就没有这个问题。有一些公共的属性和方法也可以通过继承来实现,比如所有的Component都继承自BaseComponent。

 

所以尽量多用组合,少用继承。

 

 

为了隐藏我们使用的控件和控件回调的方法,我们在ViewController.m中用延展来对我们的控件和方法进行声明。

 

//把ImageView添加到view的最底层

[self.view insertSubview:self.backView atIndex:0];

 

 

 

//音/视频播放器时间的变化(定时器执行的方法)

-(void) time

{

    //获取音频的总时间

    NSTimeInterval totalTimer = self.player.duration;

    //获取音频的当前时间

    NSTimeInterval currentTime = self.player.currentTime;

    //根据时间比设置进度条的进度

    self.progress.progress = (currentTime/totalTimer);

     

    //把秒转换成分钟

    int currentM = currentTime/60;

    currentTime = (int)currentTime`;

     

    int totalM = totalTimer/60;

    totalTimer = (int)totalTimer`;

     

    //把时间显示在lable上

    NSString *timeString = [NSString stringWithFormat:@".0f:.0f|.0f:.0f",currentM, currentTime, totalM,totalTimer];

    self.label.text = timeString;

}

 

 

 

 

 下面是iOS提供的一些管理子视图的方法,常用方法如下:

            (1) initWithFrame : 通过frame初始化视图,参数为CGRectMake(x, y, width, height);

            (2) insertSubView: atIndex: 往指定层上插入视图,哪个View调用该方法,index就是相对于谁。

            (3) insertSubView: aboveSubView: 在某个视图上插入子视图。

            (4) insertSubView: belowSubView: 在某个子视图的后面添加一个新的视图

            (5) bringSubViewToFront: 把子视图放到最前

            (6) sendSubViewToBack: 把子视图放到最后

            (7) exchangeSubviewAtIndex: withSubviewAtIndex: 交换两个视图的前后顺序

            (8) removeFromSuperview: 从父视图中移除view

            (9) -(void) addSubview: (UIView *) view 添加一个视图

 

 

视图的层次用index来区分,这个值从0开始以步长1依次增加,index为0的时候代表视图层次的最底层,

 

 

获取Storyboard创建的ViewController:

//获取storyboard: 通过bundle根据storyboard的名字来获取我们的storyboard,

        UIStoryboard *story = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];

         

        //由storyboard根据myView的storyBoardID来获取我们要切换的视图

        UIViewController *myView = [story instantiateViewControllerWithIdentifier:@"myView"];

         

        //由navigationController推向我们要推向的view

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

 

 

在一个NavigationController中只有一个NavigationBar, 而在一个NavigationController下的各个ViewController都有属于自己的NavigationBarItem.

 

//往右侧添加一个按钮

11     self.navigationItem.rightBarButtonItem = item1;

12     

13     //往右侧添加两个按钮

14     self.navigationItem.rightBarButtonItems = @[item1, item2];

 

 

CoreData的配置和使用步骤还是挺复杂的 所以尽量少用;

 

如何记录用户的登陆状态呢?就用NSUserDefault. NSUserDefault设置完值以后要进行同步   NSUserDefault是苹果提供给我们用来存储用户的登陆信息的一个类,当然是持久化的了

 

//获取UserDefaults单例

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

     

    //移除UserDefaults中存储的用户信息

    [userDefaults removeObjectForKey:@"name"];

    [userDefaults removeObjectForKey:@"password"];

     [userDefaults synchronize];

知识点5

标签:

原文地址:http://www.cnblogs.com/wwm881101/p/5460873.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!