zoukankan      html  css  js  c++  java
  • 【不定期总结】遇到的各个小技巧

    本人太懒了。。总是静不下来做总结。

    思前想后,写点算点吧。希望警醒自己,方便他人。有的也不算技巧。只是解决问题的方法,能解决问题,不见得是最好的。也希望得到大神的斧正。

    1、隐藏状态栏

    iOS7中,明显,度娘的方法

    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];

    没有得到希望的效果。

    最简单的方法是,直接在RootViewController.m里面(Cocos2d-x项目),加上:

    //ADD 20130926 FOR iOS7(隐藏状态栏)
    - (BOOL)prefersStatusBarHidden
    {
        return YES;
    }
    

    2、Cell接收的回调函数

    我犯了一个非常煞笔的错误,写在这警醒自己。我在

    [tableView setEditing:YES animated:YES];
    

    时,希望改变这个TableView里的Cell的属性。寻找API提供的回调函数时,找到了这个

    setEditing:(BOOL)editing
    

    发现没有回调事件,于是得出结论,没有相关API,自己去写代理。其实系统原本已经封装好了,对应的回调应该时

    setEditing:(BOOL)editing animated:(BOOL)animated
    

    调用什么方法,监听什么回调。这么傻的问题,估计只有我会犯。另外,千万记住,实现回调的时候,首先执行

    [super setEditing:editing animated:animated];
    

      

    3、视图跳转

    3.1、我有三个界面,分别为A、B、C。其中A通过Push到C,B通过Modal到C。C怎么返回?

    首先明确的时,Push的界面通过pop返回,Modal的界面通过Dismiss返回。这时候C又不知道时Push还是Modal,怎么知道选择哪种返回方式呢?

    答:让C知道。方法我暂时想的通过参数,进入C的时候,通过参数指明类型。返回的时候就知道了。

    - (IBAction)btnBack:(id)sender
    {
        switch (mode) {
            case EntryModePush:
                [self.navigationController popViewControllerAnimated:YES];
                break;
                
            case EntryModeModal:
                [self dismissViewControllerAnimated:YES completion:nil];
                break;
        }
    }
    

    mode是自己定义的枚举。大家可以根据需要自己定义。不过我真的觉得这种做法好学生的感觉。不知道有没有更像Coder一点做法。

    【后注】:

        if (self.navigationController) {
            [self.navigationController popViewControllerAnimated:YES];
        }else{
            [self dismissViewControllerAnimated:YES completion:nil];
        }
    

      or(by 点特.)

        UIViewController *vc;
        vc = [self.navigationController popViewControllerAnimated:YES];
        if (!vc) {
            [self dismissViewControllerAnimated:YES completion:nil];
        }
    

      

    3.2、假设有这么一个需求,需要在任意的ViewController,跳转回初始的VC。(例如场景:注销登录后返回登录界面。)

    实现的方法很多,比如加入Nav,然后poptoroot等……比如:

    self.view.window.rootViewController = self.storyboard.instantiateInitialViewController;

    4、No code signature found等其他若干问题

    不得不说,经典的东西总有他的道理。有些问题,不要从字面上去解决。

    Remember:

    1.多喝水

    2.重启一下Xocde

    5、UIButton传参 

    这是一个老生常谈的问题,都知道UIButton设置监听的方法

    [button addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];
    

    这时候由于业务需要,需要给btnClick方式带一个参数。

    简单情况下,如果参数是int类型,我们可以直接给button.tag设置数值。然后

    [button addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
    

    -(void)btnClick:(UIButton *)btn
    

    方法里btn.tag即是我们传递的值。

    如果需要传递的参数是字符串呢?笔者在这里可以很负责的讲,UIButton没办法直接传递!至少写博之时是没办法的。

    但是确实有这种需求,怎么办?

    笔者推荐两种方法:

    5.1、强传:

    api没提供直接传的方法,那么就自己加吧。自己重写一个Button可以继承于UIButton,给一个或若干个根据需求需要的属性。在使用的时候,把需要的参数写入属性。搞定!很简单,就不贴代码了。

    5.2、通过数据源:

    笔者想,可能这才是苹果官方的用意。故意不提供传参的方法,让开发者清楚:视图和事件,不应该和数据搅杂在一块。

    举个例子:

    我有10个按钮,点击每个按钮会打开不同的图片。

    难道要把图片传给按钮吗???

    当然不用!想想你的图片从哪来的?你只需要知道你点了哪个按钮,然后从数据源中取出相应按钮的数据。就完成了。

    6 编码

    6.1、常用的编码UTF-8。

    个人理解:编码:

    [string stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    

    解码:

    [string stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    

    但是api的方法是不完善的。一些特殊符号得不到相应的处理。比如:!$&'()*+,-./:;=?@_~%#[]

    NSString *str = @"+";
    str = [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    这个时候"+"仍然是"+",而不是预期的"%2b"。

    这个时候需要特殊情况特殊处理,从http://blog.csdn.net/typingios/article/details/9136005找到了参考方案。但是不知道为什么文章作者参数貌似搞错了。

    自己整理修改后如下,新建category,然后需要使用的类头文件import "NSString+URL.h" 即可调用.

    NSString+URL.h

    @interface NSString (URL)  
    - (NSString *)URLEncodedString;  
    @end  
    

    NSString+URL.m

    - (NSString *)URLEncodedString
    {
        NSString *encodedString = (NSString *)CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,(CFStringRef)self,NULL,(CFStringRef)@"!$&'()*+,-./:;=?@_~%#[]",kCFStringEncodingUTF8));
        return encodedString;
    }
    

    调用的地方

    NSString *str = @"+";
    str = [str URLEncodedString];
    

    输出结果为预期"%2b"  

    7 资源

    有些时候我们会遇到这种情况,明明把资源文件拷贝进了工程,但是在

    [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"文件名"];
    

    后发现,系统找不到这个路径。甚至在查看app的包内容也看不到。

    这个时候把我们的工程找到,在build phases里的Copy Bundle Rescources里重新加一遍就好。

    8 IB连接

    有些时候觉得自己真是钻牛角尖。大家知道,有个很简便的方法关联IB中的View和IB所在的类。

    但是今天不知道为何(到现在都不知道为何!只能解释xcode疯了)始终不让我连。纠结了好久好久都没找到方法……

    其实只要手动写上IBOutlet,再连就好了。

    9 Nav导航

    自定义UINavigation的leftItem从而自定义返回事件后,手势右滑返回失效了。在rootVC设置

    self.navigationController.interactivePopGestureRecognizer.delegate = self.navigationController;
    self.navigationController.interactivePopGestureRecognizer.enabled = YES;
    

     即可

    10 Snapshotting a view that has not been rendered results in an empty snapshot.

    这玩意我在两个地方遇到过,这里记载UIAlertController里的情况。当(1、iOS8以上设备;2、

    UIAlertControllerStyleActionSheet;3、iPad而非iPhone)使用alertController时,每新增一个选项,就会报一次异常。强迫症不能忍。

    解决方法是

    [actionSheet setPreferredContentSize: actionSheet.view.frame.size];
    

     初始化完之后加上这么一句。

    顺带,iPad上使用UIAlertControllerStyleActionSheet崩溃的原因,是因为在iPad上和iPhone上视图弹出的方式不同,当在iPad上使用时,必须设置其锚点。

    actionSheet.popoverPresentationController.sourceView = sender;
    actionSheet.popoverPresentationController.sourceRect = sender.bounds;
    

    (什么时候想起再继续吧)

  • 相关阅读:
    个人学期总结
    201571030130/201571030124《小学四则运算练习软件需求说明》结对项目报告
    201571030124/201571030130《小学生四则运算练习软件》结对项目报
    201571030124 四则运算
    201571030124 初读《构建之法》(Build To Win)有感
    个人学期总结
    201571030130/201571030124《小学四则运算练习软件软件需求说明》结对项目报告
    201571030130/201571030124《小学生四则运算练习软件》结对项目报
    201571030130 小学生四则运算练习软件项目报告
    读《现代软件工程——构建之法》有感
  • 原文地址:https://www.cnblogs.com/anjohnlv/p/3502201.html
Copyright © 2011-2022 走看看