消息,调用,UIDocumentInteractionController,QLPreviewController

 

几个新类型:

http://blog.chinaunix.net/u3/104182/showart_2248115.html

 

1. Target-Action 模式

   NSObject performSelector:@selector()...    类似函数指针的用法. 但它传递参数有限.   可能使用协议可替代,并且可以增加代码清晰度.

    它有一个waitUntilDone的参数,可以设置是异步还是同步执行方法.

   使用函数指针获得极大的动态性, 但是付出的代价就是编译器不知道我们要执行哪一个方法,所以在编译的时候不会找出错误,只有执行的时候才知道函数指针是否正确。
  Target-Action Paradigm 完全是面向对象的事件传递机制。运行时,通过respondsToSelector: 方法来检查实现的情况。如果有实现,那么使用performSelector:withObject:来调用具体的Action。

 

2.通知是一种对象间通信的轻量级机制.

    [[NSNotificationCenter defaultCenter] addObserver... ];注册或订阅消息,可以订阅自定义的或系统的消息.

    [[NSNotificationCenter defaultCenter] postNotificationName... ]; 发送同步消息

 

    系统消息如:UIApplicationWillTerminateNotification

    消息响应函数使用NSNotification作为参数.

    对同一个消息注册多次,则发送消息时,会响应多次。

 

3. Protocal 协议,类似于接口的用法.

 

 

4. @select()

    在Objective-C里,方法的名字包含了方法名和第一个参数的冒号,以及后面所有参数的参数标识加上相应的冒号,如果没有参数就不加冒号。

-(void)foo:(id)bar withFoo1:(id)bar1

{
}

这个方法真实的名字是 foo:withFoo1:

 

 

5.Objective C中的少用函数调用的概念,而是用对象之间“消息”的传递(messaging)来代替.

   ObjC中是以消息机制来工作的.  诸如-(void)foo:(int)a的语句在编译时被 objc_msgSend(receiver,selector,arg1,arg2,….)替换了,其实每一条发送消息的代码本质上还是调用函数 (call function),不过他们调用的都是同一个函数objc_msgSend,也可能是objc_msgSend_stret(返回值是结构体),objc_msgSend_fpret(返回值是浮点型)等.

   分析objc_msgSend(receiver,selector,arg1,arg2,….)的参数,第一个receiver的类型是id,代表接受消息的对象, 第二个是selector代表接收对象的方法,后面的是该方法的参数. [theClass foo:10]被编译成objc_msg(theClass,@selector(foo:),10);

   它的实现是基于ObjC runtime. NSObject类实现了这套机制,所以每一个继承于NSObject的类都能自动获得runtime的支持。在这样的类中,有一个isa指针,指向该类定义的数据结构体,这个结构体是由编译器在编译时为类(须继承于NSObject)创建的.在这个结构体中有包括了指向其父类类定义的指针以及Dispatch table. Dispatch table是一张SEL和IMP的对应表。对于名称相同的方法,他们都有相同的SEL,方法的名称不包括类名称,所以子类和父类中的同名方法拥有相同的SEL,但是他们的实现可以各不相同,因而在他们各自的Dispatch表中SEL所对应的IMP是不同的,IMP是一个函数指针,而虽然每一个SEL对应的是一个方法的名称,但考虑到效率,SEL本身是一个整型,编译器会另外生成一张SEL和方法名称对应的表。有了这样的结构,objc就可以实现多态了。

 

6.动态给类增加消息.

 

7.

Delegate:
消息的发送者(sender)告知接收者(receiver)某个事件将要发生,delegate同意然然后发送者响应事件,delegate机制使得接收者可以改变发送者的行为。通常发送者和接收者的关系是直接的一对多的关系。

Notification:
消息的发送者告知接收者事件已经发生或者将要发送,仅此而已,接收者并不能反过来影响发送者的行为。通常发送者和接收者的关系是间接的多对多关系。

 

Notification是广播。
Delegate是点对点。


 

9.NSInvocation


10.模块间协作,尽量不使用target-action模式,慎用通知,优先使用代理。

 

11.KVO=KeyValue Observing,KVC=Key Value Coding

     Kvo是Cocoa的一个重要机制,他提供了观察某一属性变化的方法,极大的简化了代码。这种观察-被观察模型适用于这样的情况,比方说根据A(数据类)的某个属性值变化,B(view类)中的某个属性做出相应变化。对于推崇MVC的cocoa而言,kvo应用的地方非常广泛。(这样的机制听起来类似Notification,但是notification是需要一个发送notification的对象,一般是notificationCenter,来通知观察者。而kvo是直接通知到观察对象。)

http://www.cnblogs.com/scorpiozj/archive/2011/03/14/1983643.html

例:

 Student *stu = [[Student alloc]init];
    [stu addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew context:nil];
    stu.name = @"张三";

    stu.name值改变时,会调用下面的方法

 - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    NSLog(@"keyPath:%@ object:%@ change:%@",keyPath,object,change); 
}

http://hi.baidu.com/492437598/blog/item/6ed35079c748e7f52f73b380.html



12.应用之间调用

    http://blog.csdn.net/pjk1129/article/details/6641211

    http://blog.csdn.net/pjk1129/article/details/6643411


    跳转到appstore:

   [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"itms://itunes.apple.com/app/sandman/id388887746?mt=8&uo=4"]];
或者
  [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"itms-apps://itunes.apple.com/app/sandman/id388887746?mt=8&uo=4"]];

  [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"itms-apps://itunes.apple.com/app/hainan-tianya-online-network/id451916383?mt=8&uo=4"]];
  后者直接打开app store


   当在手机上的网页中的链接有http://itunes.apple.com/app...时,需要把http替换成itms-apps,然后使用上面的方式跳到appstore中。

   
   跳转到评分:
     在应用中加入打分按钮,点击后直接跳转到 App Store 的评分界面,可以解决在用户用了好软件后忘记或嫌麻烦而不去 App Store 进行打分评星。
     App Store 上评论的链接地址是 itms-apps://ax.itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id = appleID
    NSString* appleid=@"451916383";
    NSString *str = [NSString stringWithFormat:
                     @"itms-apps://ax.itunes.apple.com/WebObjects/MZStore.woa/wa/viewContentsUserReviews?type=Purple+Software&id=%@",
                     appleid ];  
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:str]];


   ios或mac程序中添加链接到评价页面的方法

    http://blog.csdn.net/terrytan18/article/details/7377836


13. 打开documents下的文件,或包中的资源文件。
 用浏览器打开word

    NSString *path = @"/..../xx.doc";

    NSURL *url = [NSURL fileURLWithPath:path];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [webView loadRequest:request];

 

在SDK中打开其他接入应用的解决方案

http://blog.csdn.net/arthurchenjs/article/details/6920631

应用程序间通讯 - URL Scheme

http://blog.csdn.net/flower4wine/article/details/6454957

 在Mac和iOS中注册自定义的URL Scheme

 http://cocoa.venj.me/blog/custom-url-scheme-on-mac-and-ios/

iOS应用中打开一些其他应用的URL-Scheme

http://willonboy.tk/?p=742

iPhone开发技巧 URL Scheme启动进程调试教程

http://mobile.51cto.com/iphone-278973.htm

请问程序中如何调用safari来打开本地html文件?未有答案。

http://www.cocoachina.com/bbs/read.php?tid=17135&page=1



13.1 UIDocumentInteractionController 用真机测试,模拟器可能不起作用。

        UIDocumentInteractionController uses QLPreviewController to display. It allows for additional hooks for delegate methods.

#pragma mark -
#pragma mark loadDocument
-(void)loadDocument:(NSString*)path
{    
    /*
    //use UIWebView
    NSURL *url = [NSURL fileURLWithPath:path];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    if(!iWebView)
    {
        iWebView=[[UIWebView alloc] initWithFrame:self.view.bounds];
        iWebView.scalesPageToFit = YES;
        for (id subview in iWebView.subviews)
        {
            if ([[subview class] isSubclassOfClass: [UIScrollView class]])
            {
                ((UIScrollView *)subview).bounces = NO;
            }
        }
        [self.view addSubview:iWebView];
    }
    [iWebView loadRequest:request];
     */
    
    //use UIDocumentInteractionController
    NSURL *url = [NSURL fileURLWithPath:path];
    UIDocumentInteractionController* controller = [[UIDocumentInteractionController interactionControllerWithURL:url] retain];
    controller.delegate = self;
    BOOL ret = [controller presentOpenInMenuFromRect:CGRectZero inView:self.view animated:YES];//documentInteractionControllerDidDismissOpenInMenu
    if (!ret)
    {
        ret = [controller presentPreviewAnimated:YES];//documentInteractionControllerDidEndPreview
        
        if (!ret)
        {
            [DialogUtil postAlertWithMessage:@"open failed"];
        }
    }
}

#pragma mark -
#pragma mark UIDocumentInteractionControllerDelegate
- (UIViewController *)documentInteractionControllerViewControllerForPreview:(UIDocumentInteractionController *)controller
{
    return self;
}
- (void)documentInteractionControllerDidEndPreview:(UIDocumentInteractionController *)controller
{
    NSLog(@"documentInteractionControllerDidEndPreview");
    [controller autorelease];
}
- (void)documentInteractionControllerDidDismissOpenInMenu:(UIDocumentInteractionController *)controller
{
    NSLog(@"documentInteractionControllerDidDismissOpenInMenu");
    [controller autorelease];
}

13.2 结果是用canOpenURL不能打开本地文件
    NSURL *url = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@",path]];
    BOOL ret=[[UIApplication sharedApplication] canOpenURL:url];
    if(ret)
    {
        ret=[[UIApplication sharedApplication] openURL:url];
        NSLog(@"canOpenURL");
        
        if(!ret)
        {
            [DialogUtil postAlertWithMessage:[NSString stringWithFormat:@"open %@ failed",[url absoluteString]]];
        }
    }
    else
    {
        [DialogUtil postAlertWithMessage:[NSString stringWithFormat:@"can't open %@",[url absoluteString]]];
    }


13.3 画PDF使用QurtZ的CGPDFDocumentGetPage,CGContextDrawPDFPage等相关API。

13.4 iPhone上看Word、Excel、PDF全攻略

http://iphone.tgbus.com/tutorial/use/200801/20080102113010.shtml

13.5  iOS中使用QLPreviewController来预览文件

         http://www.acwind.net/blog/?p=1267 

         QuickLook.framework

         #import <QuickLook/QLPreviewController.h>

if([QLPreviewController canPreviewItem:(id <QLPreviewItem>)localFileUrl])

{

        QLPreviewController* previewController=[[QLPreviewController alloc] init];
        previewController.dataSource=self;
        [viewController presentModalViewController:previewController animated:YES];
        [previewController release];

}

        #pragma mark -
#pragma mark QLPreviewControllerDataSource
- (NSInteger)numberOfPreviewItemsInPreviewController:(QLPreviewController *)controller;
{
    return 1;
}
- (id)previewController:(QLPreviewController *)previewController previewItemAtIndex:(NSInteger)idx
{   
    NSURL* url=previewItemURL_;
    
    return url;
}

  



14.http://tiny4cocoa.com/thread-1963-1-1.html

在 iOS中可以直接调用 某个对象的消息 方式有2中

一种是performSelector:withObject:

再一种就是NSInvocation

第一种方式比较简单,能完成简单的调用。但是对于>2个的参数或者有返回值的处理,那就需要做些额外工作才能搞定。那么在这种情况下,我们就可以使用NSInvocation来进行这些相对复杂的操作

NSInvocation可以处理参数、返回值。会java的人都知道凡是操作,其实NSInvocation就相当于反射操作。

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值