微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

消息,调用,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,….)的参数,第一个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://www.voidcn.com/article/p-ehjgkmak-rq.html

应用程序间通讯 - 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就相当于反射操作。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐