empty类的使用 ios
2014-03-01 22:02:05 u010040590 阅读数 3071

程序没问题,运行报错:Directory not empty

解决:

位于/Users/你电脑名/Library/Developer/Xcode/DerivedData  下的缓存文件占很大的缓存空间,如果长时间不删除xcode下的缓存文件,就会导致硬盘空间越来越小直到Directory not empty。删除了缓存文件再运行就不会再报错。


参考:http://blog.csdn.net/sky_snow45/article/details/8895462

2015-12-29 15:56:52 a13838375807 阅读数 335

UIKit提供了一组控件:UISwitch开关、UIButton按钮、UISegmentedControl分段控件、UISlider滑块、UITextField文本字段控件、

UIPageControl分页控件。

控件是对UIView派生类的实用增强及补充,并可以直接附着于导航栏、表格单元,甚至更大的对象。

这些控件的基类均是UIControl,而UIControl派生自UIView类,所以每个控件都有很多视图的特性,包括附着于其他视图的能力。所有

控件都拥有一套共同的属性和方法。

所以学习控件,我们先学习UIControl



属性


enabled
控件默认是启用的。要禁用控件,可以将enabled属性设置为NO,这将导致控件忽略任何触摸事件。被禁用后,控件还可以用不同的方式显示自己,比如变成灰色不可用。虽然是由控件的子类完成的,这个属性却存在于UIControl中。


selected

当用户选中控件时,UIControl类会将其selected属性设置为YES。子类有时使用这个属性来让控件选择自身,或者来表现不同的行为方式。


contentVerticalAlignment

控件如何在垂直方向上布置自身的内容。默认是将内容顶端对其,对于文本字段,可能会改成UIControlContentVerticalAlignmentCenter。对于这个字段,可以使用下列诸值:

1.UIControlContentVerticalAlignmentCenter  

2.UIControlContentVerticalAlignmentTop  

3.UIControlContentVerticalAlignmentBottom  

4.UIControlContentVerticalAlignmentFill

 
contentHorizontalAlignment
水平方向

1.UIControlContentHorizontalAlignmentCenter  

2.UIControlContentHorizontalAlignmentTop  

3.UIControlContentHorizontalAlignmentBottom  

4.UIControlContentHorizontalAlignmentFill  


事件通知


UIControl类提供了一个标准机制,来进行事件登记和接收。这令你可以指定你的控件在发生特定事件时,通知代理类的一个方法。如果要注册一个事件,可以使用addTarget方

法:

[ myControl addTarget: myDelegate   action:@selector(myActionmethod:)  forControlEvents:UIControlEventValueChanged ];

事件可以用逻辑OR合并在一起,因此可以再一次单独的addTarget调用中指定多个事件。下列事件为基类UIControl所支持,除非另有说明,也适用于所有控件


UIControlEventTouchDown

单点触摸按下事件:用户点触屏幕,或者又有新手指落下的时候。


UIControlEventTouchDownRepeat

多点触摸按下事件,点触计数大于1:用户按下第二、三、或第四根手指的时候。


UIControlEventTouchDragInside

当一次触摸在控件窗口内拖动时。


UIControlEventTouchDragOutside

当一次触摸在控件窗口之外拖动时。


UIControlEventTouchDragEnter

当一次触摸从控件窗口之外拖动到内部时。


UIControlEventTouchDragExit

当一次触摸从控件窗口内部拖动到外部时。


UIControlEventTouchUpInside

所有在控件之内触摸抬起事件。


UIControlEventTouchUpOutside

所有在控件之外触摸抬起事件(点触必须开始与控件内部才会发送通知)。


UIControlEventTouchCancel

所有触摸取消事件,即一次触摸因为放上了太多手指而被取消,或者被上锁或者电话呼叫打断。


UIControlEventTouchChanged

当控件的值发生改变时,发送通知。用于滑块、分段控件、以及其他取值的控件。你可以配置滑块控件何时发送通知,在滑块被放下时发送,或者在被拖动时发送。


UIControlEventEditingDidBegin

当文本控件中开始编辑时发送通知。


UIControlEventEditingChanged

当文本控件中的文本被改变时发送通知。


UIControlEventEditingDidEnd

当文本控件中编辑结束时发送通知。


UIControlEventEditingDidOnExit

当文本控件内通过按下回车键(或等价行为)结束编辑时,发送通知。


UIControlEventAllEditingEvents

通知所有关于文本编辑的事件。


UIControlEventAllEvents

通知所有事件。


要删除一个或多个事件的相应动作,可以使用UIControl类的removeTarget方法。使用nil值就可以将给定事件目标的所有动作删除:

[ myControl removeTarget:myDelegate   action:nil  forControlEvents:UIControlEventAllEvents];

  

要取得关于一个控件所有指定动作的列表,可以使用allTargets方法。这个方法返回一个NSSet,其中包含事件的完整列表:

NSSet* myActions = [myConreol allTargets ];  


另外,你还可以用actionsForTarget方法,来获取针对某一特定事件目标的全部动作列表:

NSArray* myActions = [ myControl actionForTarget:UIControlEventValueChanged ];  


如果设计了一个自定义控件类,可以使用sendActionsForControlEvent方法,为基本的UIControl事件或自己的自定义事件发送通知。例如,如果你的控件值正在发生变化,就可以

发送相应通知,通过控件的代码可以指定时间目标,这个通知将被传播到这些指定的目标。例:

[ self sendActionsForControlEvents:UIControlEventValueChanged ]; 


当委托类得到事件通知时,他将收到一个指向事件发送者的指针。下面的例子用于处理分段控件的事件,你的动作方法(action method)应遵循类似的处理方式:

-(void) myAction:(id)sender{  

       UISegmentedControl* control = (UISegmentedControl*)sender;  

       if(control == myControl1){  

       /*查询控件得值*/  

      /*响应myControl1的动作*/  

       }  
}  
2012-11-17 13:28:02 gloryFlow 阅读数 614
Objective-C提供了一个非常灵活的类(Class)扩展机制-类别(Category)。类别用于对一个已经存在的类添加方法(Methods)。你只需要知道这个类的公开接口,不需要知道类的源代码。需要注意的是,类别不能为已存在的类添加实例变量(Instance Variables)。

ios category类别的使用

Objective-C提供了一个非常灵活的类(Class)扩展机制-类别(Category)。类别用于对一个已经存在的类添加方法(Methods)。你只需要知道这个类的公开接口,不需要知道类的源代码。需要注意的是,类别不能为已存在的类添加实例变量(Instance Variables)。

类别的基本语法如下:
@interface ClassName(CategoryName)
//method declarations
@end
@interface 类名(类别名)
类别方法申明
@end

注意几点:

1.现有类的类名位于 @interface之后

2.括号中是类别的名称(只要名称唯一,可以添加任意多的类别)

3.类别没有实例变量部分

类别的语法与类的语法非常相似。类别的方法就是类的方法。类别的定义可以放在一个单独的文件中("类别名.h"), 也可以放在一个已存在的类的定义文件中(.h文件)。类别的实现则可放在一个单独的“类别名.m”文件中,或另一个类的实现文件中。这点也与类的定义相似。因为类别的方法就是类的方法,所以类别的方法可以自由引用类的实例变量(无论公有或私有)。
子类(subclassing)是进行类扩展的另一种常用方法。与子类相比,类别最主要的优点是:系统中已经存在的类可以不需修改就可使用类别的扩展功能。例如,假设系统中存在一个类A;另外一个类B中定义了一个类A类型的实例变量,并包含了类A的头文件“#import <A.h>"。假设一段时间后,需要对类A扩展几个新的方法。如果用子类,就需要创建一个子类A-1。如果类B想要使用类A的新方法,就要进行如下修改:1) 将包含的头文件改为"#import<A-1.h>"; 2)将所有用到的类A对象改为类A-1的对象。可以想象,如何有很多类需要用到类A的新功能(比如类A是iOS中的类UIViewController),随着系统的升级(iOS从1.0到5.0),你的程序需要不停地进行这种繁琐地修改。如果使用类别,即使类A升级了,系统中其它的类可以不需任何修改,直接就可以调用类A的新方法。
类别的第二大优点是实现了功能的局部化封装。类别定义可以放在一个已存在的类(类A)的定义文件中(.h)。这意味着这个类别只有在类A被引用的前提下才会被外部看到。如果另一个类(类B)不需要用到类A的功能(没有包含类A的.h文件),也就不会看到依附类A存在的类别。iOS SDK中广泛运用这种类别定义法来封装功能。例如,在UINavigationController.h中定义了专为UINavigationController扩展的UIViewController类别:
@interface UIViewController (UINavigationControllerItem)
@property(nonatomic,readonly,retain) UINavigationItem *navigationItem; 
@property(nonatomic,readonly,retain) UINavigationController *navigationController; 
......
@end
如果一个类不引用UINavigationController.h,也就不会看到navigationItemnavigationController这两个性质申明(declared property)。
类别的另一个优点是轻巧(light-weight)。很多时候,对已存在的类所需的扩展仅仅是几个新方法。这时,用类别避免了在系统中留下很多非常短小的“微”子类,使程序更加紧凑。
归纳:

1、实现类别

同实现类相似,实现方法即可

2、 类别的局限性

1.类别不能添加新的实例变量

2.命名冲突,如果类别中方法和类中已有方法同名,则类别具有更高优先级

3 类别的作用

1.将类的实现分散到多个不同文件或多个不同框架中

2.创建私有方法的前向引用

3.向对象添加非正式协议

4 利用类别分散实现

利用类别可以将类的方法分散到多个源文件中

特别指出的是:类别可以访问其继承的类的实例变量

在使用一个方法时,对象的方法是在接口中声明、父类中声明、还是类别中声明并不重要

类别不仅可以分散实现到不同源文件,也可跨框架

5、 使用类别创建前向引用

虽然可以实现未声明的方法,但是编译器会提出警告

通过类别可以提供声明,而且,声明的方法不必要一定在类别的实现中实现,也可以在类的实现中实现

6、 非正式协议和委托类别

委托(delegage)是一种对象,另一个类的对象会要求委托对象执行它的某些操作

委托对象接受其它对象对它的特定方法的调用

其实就是委托对象必须实现别的对象调用的方法,与接口类似

7、 ITunesFinder项目

8 、委托和类别

委托和类别有什么关系?委托强调类别的另一种应用:被发送给委托对象的方法可以声明为一个NSObject的类别

创建一个NSObject的类别称为“创建一个非正式协议”

9、 响应选择器

选择器只是一个方法名称,可以使用@selector()预编译指令指定选择器,其中方法名位于圆括号中,但它以OC运行时使用的特殊方式编码,以快速执行查询

NSObject提供了一个respondsToSelector的方法,询问对象以确定其是否实现某个特定消息

10、 选择器的其他应用

选择器可以被传递,可以作为方法参数,甚至可以作为实例变量存储

2014-05-06 09:07:53 u014724552 阅读数 510
NSPredicate这个类有点类似于数据库中的查询,是用于在一批内容中查询符合条件的子集,中文翻译成“谓词”。这个翻译实在让我感觉很别扭,虽然明知道和谓语这个词语没什么关系,但确实总让我感觉这是一个句子里面的成分。

        我们有些时候会有一个对象的数组或者集合,然后希望从里面找出符合条件的集合,类似于做一次过滤操作。比如我有一批照片,希望能找出所有某一天里面拍摄的内容。


         NSPredicate类的创建往往使用predicateWithFormat的方法,这个方法的使用有点类似于stringWithFormat方法。

        比如:我们想从一个目录下所有的文件中找出Default.png文件,那么

        NSPredicate  *predicate;

        predicate = [NSPredicate predicateWithFormat: @"name == 'Default.png ' "];

        这个谓词字符串看上去象标准的C表达式,左侧的name是键路径,随后的==是运算符,右侧是一个引用字符串。生成了谓词之后,如果你有一个对象希望判断一下是否符合条件,则使用evaluateWithObject方法

        BOOL match = [predicate evaluateWithObject: file];


         谓词最根本的功能就是这样,判定一个对象是否符合某个过滤条件,返回总是一个BOOL类型。如果你有一系列的对象,那么就做一个的循环即可。

         当然,iOS的NSPredicate如果就这些功能,那么未免弱了点,有失顶级平台的风范。这个类有一系列的扩充:

1. 比较和逻辑运算符

         就像前面的例子中使用了==操作符,NSPredicate还支持>, >=, <, <=, !=, <>,还支持AND, OR, NOT(或写成C语言样式&&, ||, ! ),其中AND,OR,NOT还是不区分大小写的


2. SELF和LIKE

        请注意,这个并非iOS里面的self那个保留字。为什么会引入SELF这个东西呢?是因为不可能每次写谓词都有那么明确的键路径好用,而这个SELF可以引用用于谓词计算的对象。

        LIKE运算符是用于通配符的支持,这个通配符就是?和*,这两个通配符应该是很熟悉的了。

        有了这两个利器后,写谓词也是方便许多,比如我想匹配所有D打头的png文件,那么就是写  

    NSString *match = @"D*.png"; 

    [NSPredicate predicateWithFormat:@"SELF LIKE %@", match];


3. 格式化

    这个在上面的例子中已经出现了,支持格式化可以进一步提高编码的灵活度。


4. 正则表达式

    谓词的表达式还支持正则表达式,记得我看见这个时都有点吃惊了。这样的话这个谓词的灵活可谓到了极致,如果写的比较好的话,可以实现相当复杂的过滤功能。


    NSPredicate给我留下最深印象的是两个数组求交集的一个需求,如果按照一般写法,需要2个遍历,但NSArray提供了一个filterUsingPredicate的方法,用了NSPredicate,就可以不用遍历!

    NSArray *array1 = [NSArray arrayWithObjects:@"abc1", @"abc2", nil];

    NSArray *array2 = [NSArray arrayWithObjects:@"a1", @"abc1", @"abc4", @"abc2", nil];

    NSPredicate *thePredicate = [NSPredicate predicateWithFormat:@"SELF in %@", array1];

    [array2 filterUsingPredicate:thePredicate];

        当你想从一批对象中过滤出一些内容时,请一定要记得NSPredicate这个东东哦


2012-06-26 11:03:00 weixin_30261095 阅读数 1

创建一个 Timer

  • + scheduledTimerWithTimeInterval: invocation: repeats:
  • + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti   invocation:(NSInvocation *)invocation   repeats:(BOOL)yesOrNo;
  • + scheduledTimerWithTimeInterval: target: selector: userInfo: repeats:
  • + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti   target:(id)aTarget   selector:(SEL)aSelector   userInfo:(id)userInfo   repeats:(BOOL)yesOrNo;
  • 创建返回一个新的NSTimer对象和时间表,在当前的默认模式下循环调用一个实例方法。
  • + timerWithTimeInterval: invocation: repeats:
  • + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo;
  • + timerWithTimeInterval: target:selector: userInfo:repeats:
  • + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo;
  • – initWithFireDate: interval: target: selector: userInfo: repeats:
  • - (id)initWithFireDate:(NSDate *)date   interval:(NSTimeInterval)ti     target:(id)t    selector:(SEL)s    userInfo:(id)ui    repeats:(BOOL)rep;

scheduledTimerWithTimeInterval:(NSTimeInterval)seconds  

预订一个Timer,设置一个时间间隔。

表示输入一个时间间隔对象,以秒为单位,一个>0的浮点类型的值,如果该值<0,系统会默认为0.1

 target:(id)aTarget

表示发送的对象,如self

 selector:(SEL)aSelector

方法选择器,在时间间隔内,选择调用一个实例方法

userInfo:(id)userInfo

此参数可以为nil,当定时器失效时,由你指定的对象保留和释放该定时器。

repeats:(BOOL)yesOrNo

YES时,定时器会不断循环直至失效或被释放,当NO时,定时器会循环发送一次就失效。

invocation:(NSInvocation *)invocation

 

启动 Timer

  • – fire

停止 Timer

  • – invalidate

Timer设置

  • – isValid
  • – fireDate
  • – setFireDate:
  • – timeInterval
  • – userInfo

NSTimeInterval类:是一个浮点数字,用来定义秒


例子:

iphone为我们提供了一个很强大得时间定时器 NSTimer

他可以完成任何定时功能:

我们使用起来也很简单,只要记住三要素就可以,具体得三要素是:时间间隔NSTimeInterval浮点型,事件代理

delegate和事件处理方法@selector();就可以用

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo; 来初始化一个 时间定时器

下面我写了一个很简单得例子

初始化一个定时器:

-(void)initTimer

{

//时间间隔

NSTimeInterval timeInterval =1.0 ;

//定时器

NSTimer   showTimer = [NSTimer scheduledTimerWithTimeInterval:maxShowTime

                                                                 target:self

                                                            selector:@selector(handleMaxShowTimer:)

                                                               userInfo:nil

                                                                repeats:NO];

}

//触发事件

-(void)handleMaxShowTimer:(NSTimer *)theTimer

{

NSDateFormatter dateFormator = [[NSDateFormatter alloc] init];

dateFormator.dateFormat = @"yyyy-MM-dd  HH:mm:ss";

NSString *date = [dateformater stringFromDate:[NSDate date]];

if([date isEqualToString:@"2011-11-09 23:59:59"])

{

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:TITLE_NAME

        message:@"现在马上就有新的一天了!"

       delegate:self

       ancelButtonTitle:nil

      otherButtonTitles:CONFIRM_TITLE, nil];

[alert show];

[alert release];

}

[data release];

[dateFormator release];

转载于:https://www.cnblogs.com/martin1009/archive/2012/06/26/2563341.html

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