《iOS开发指南:从零基础到App Store上架》读书笔记(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。有问题要问我啊,别像个娘们似的,说这不行那不行的!!!如果写的文章和别人一样,那你还是不要写了,我替你丢脸!!! https://blog.csdn.net/yyh3663477/article/details/54376450

新浪微博:东门兜

Page 9讲到了storyboard,使用Xcode 6.3的你会感到困惑,因为storyboard中的View Controller不再是长方形的,而是正方形的,这是因为Size Classes,它是Xcode 6添加的特性。在学习Size Classes之前,你又不得不学习AutoLayout。那么你可以学习一下布局四部曲(相当优秀,感谢译者:叶孤城_):
SizeClass和AutoLayout教程1
SizeClass和AutoLayout教程2
SizeClass和AutoLayout教程3
SizeClass和AutoLayout教程4
教程2中说到:“在Identity Inspector里设置UIView的Document里的Label属性为‘TextContainer’。”我们经常直接在这边改就好了,不过作者也让我们涨姿势了:

改 view 的名称

“把controller的view背景色调成RGB(74,171,247)”额,有的同学一直找不到这个设置,看下下面这个图:

RGB颜色设置

“然后我们设置ImageView的image属性为cloud”是将image的名字改为cloud。

有些人觉得,我能不能自己随便找张图,而不要用作者的那张图,我当然是不建议你这么做。因为update frames后,你的例子可能就悲剧了。

布局的话题就讲这么多,继续吧(别忘了,多敲代码,多思考)。

还有就是:一遇到新知识,想必大家都感到头疼,但是一旦熟悉了之后,那种恐惧心理就会被喜悦所消灭。:)


在Xcode6.3中:

P12文中讲的Application类型:OpenGL Game没了、Utility Application没了、Empty Application没了。

文中讲的Supporting Files文件:InfoPlist.string本地化文件没了、Prefix.pch没了。

文中讲的Frameworks没了。

文中讲的Application does not run in background没了。

有人问,没了怎么办?自己加咯! = =。

状态跃迁过程中应用回调的方法和本地通知


Page 26文中讲到
“[coder encodeObject:self.txtField.text forKey:kSaveKey];”,额,当中txtField是怎么来的,这个居然没介绍……

创建实例变量

按住cotrol,鼠标左键按住textField组件,往代码行方向拖动,来创建一个关联变量,你也可以先看下43页。(怎么打开两个窗口?)

打开两个窗口

文中讲到“kSaveKey”这个变量呢。。。
通过看代码了解到他在头文件定义了这个东西(自己定义了也不说下):
“#define kSaveKey @”UnsavedText” ”

Application does not run in background设置为YES的时候,点击home键,会调用中断代码:
“- (void)applicationWillTerminate:(UIApplication *)application”使程序退出。


P26页中,一个工程只有一个Project,但可以有一个或多个Target。Target继承了Project。对于Target和Project下都有的设置项,可根据需要对Target进行再设置,此设置可覆盖Project的设置。

文中讲到“要指定运行哪一个Target,可以通过选择不同的Scheme来实现。……”点一下Target就可以切换了,不需要再选择模拟器。

P43讲到“将输入口命名为Label1”,这个命名方式不符合编码规范,一般来说,变量的首字母应该小写。

P45讲到使用故事板添加delegate,我们一般不这么拖,而是直接在Scene里面,右键按住textField控件,拖到View Controller就可以了:

设置delegate

有的同学看到委托呀,通知呀,可能会一头雾水,先听着,之后会讲到,你就先这么用,这么敲代码就好了。

P52页的代码,改成这样子更通俗易懂一些:

- (IBAction)testLoadHTMLString:(id)sender {
    NSString *htmlPath = [[NSBundle mainBundle] 
                         pathForResource:@"index" ofType:@"html"];
                        //读取文件内容赋给htmlPath

    NSError *error = nil;

    NSString *html = [[NSString alloc] initWithContentsOfFile:
            htmlPath encoding: NSUTF8StringEncoding error:&error];
                    //指定字符集

    //  或者写成 if(!error)
    if (error == nil) {//数据加载没有错误的情况下

        NSURL *bundleUrl = [NSURL fileURLWithPath:
                        [[NSBundle mainBundle] bundlePath]];
                        //获取index.html所在的资源目录

        [self.webView loadHTMLString:html baseURL:bundleUrl];
    }
}

P64文中的例子是当键盘弹出时,输入域能够上移到看得见的地方。不晓得为何要这么麻烦,直接界面上移不就行了么?(实在是想吐槽他的代码规范,,,抱歉,我有话直说,对事不对人)。

在Xcode 6中,怎么设置scrollView,貌似是个难题。试试按照我的方式做吧:
1、放置一个scrollView铺满整个View Controller的view(以下称mainView)。
2、设置scrollView的约束,相对于mainView的上下左右间距为0。
3、放置一个view(以下称contentView)在scrollView中,并铺满整个scrollView。
4、设置contentView的约束,相对于scrollView的上下左右间距为0,“宽度为mainView的宽度,高度为mainView的高度”。

这样做应该就没问题了。


如果你决定开始使用Xcode 6.3的SizeClass,那就不需要看3.10 屏幕布局这一章了。
顺便看一下iOS SDK各版本使用率:

iOS SDK 各版本使用率

iOS 8的使用率还是蛮高的,虽然比之前的版本表现差些,但是至少比安卓好很多,嘿嘿嘿,有话直说,吐槽Android了。

P81应该多讲一些纯代码布局比较好一些。毕竟storyboard的布局比较简单一些。

P86“在软件领域,有句话很经典:‘有输入的地方,就要验证。’ ”

数据源和委托一样,都是委托设计模式的具体实现,只不过它们的角色不同:委托对象负责控制控件外观,如选择器的宽度、选择器的行高等信息,此外,还负责对控件的事件和状态变化作出反应。数据源对象是控件与应用数据(模型)的桥梁,如选择器的行数、拨轮数等信息。委托中的方法在实现时是可选的,而数据源中的方法一般是必须实现的。

P95除了这种做法外,还可以拖一个UICollectionViewController到StoryBoard中,然后,将这个控件设置为初始化视图控制器。你可以尝试这么做:

拖一个 UICollectionViewController

然后和现有的ViewController文件取得联系:

修改ViewController文件

建立联系


P96 “需要将UIImageView和UILabel拖曳到单元格中”这个相信没人能拖成功吧,因为它还没将cell和文件取得联系(具体操作看上面那个图)。

UICollectionView,你要弄清楚indexPath.section和indexPath.row是怎么算的。

P111提到重新创建工程,你其实不必这么做,再弄个新的Controller进去替换旧的Controller就可以了。

UISearchDisplayController在iOS 8当中被废弃了。

苹果又来坑了,在Xcode 6.3.1中shows scope bar出问题了,网上找的解决方案都不行,囧。标记,有待解决!

shows scope bar

(微云这东西还真真是想吐槽,凌晨0点或1点的时候,经常维护,分享的软件链接还失效,看来还是用百度云吧。后来居然发现百度云图片链接无法持久保存,哎,这两个产品真是半斤八两。)

大家在使用iPhone通讯录时会发现右侧可以按字母检索,使用起来很方便,其实这个功能使用UITableView实现很简单,只要实现数据源协议的一个方法,构建一个分组标题的数组即可实现。数组元素的内容和组标题内容未必完全一致,UITableView是按照数组元素的索引和每组数据索引顺序来定位的而不是按内容查找。

文中表视图添加和删除的demo有个bug,就是当点击Edit时,点击Add文本域,然后点击Done,键盘没有收起来。

文中竟然没有介绍加载更多……偷工减料么?
关于下拉刷新和上拉加载更多的Demo,可以去这个网站下载:
简单易用的上拉和下拉刷新(多版本细节适配)
感觉一般般,有时间的话自己再写个吧~~~
标记,有待解决!


P138说到视图控制器的分类,在iOS 8中的视图控制器有哪些呢?
UIActivityViewController
UIAlertController
UICollectionViewController
UIDocumentInteractionController
UIDocumentMenuViewController
UIDocumentPickerExtensionViewController
UIDocumentPickerViewController
UIImagePickerController
UIInputViewController
UIMenuController
UINavigationController
UIPageViewController
UIPopoverController
UIPopoverPresentationController
UIPresentationController
UIPrinterPickerController
UIPrintInteractionController
UIReferenceLibraryViewController
UISearchController
UISearchDisplayController
UISplitViewController
UITabBarController
UITableViewController
UIVideoEditorController
UIViewController

= =!好多,不过,我们整理一下比较经常使用的控制器:
UINavigationController
UITabBarController
UITableViewController
UIViewController

P145按照他说的代码写了的话,估计很多同学点击注册按钮的时候程序都会崩溃。
在Xcode 6.3中,Storyboard文件的文件名变成了“Main.storyboard”,而不是书上说的“MainStoryboard”,注意下面这段代码:

UIStoryboard* mainStoryboard = [UIStoryboard 
                        storyboardWithName:@"MainStoryboard" bundle:nil];

把它改为:

UIStoryboard *mainStoryboard = [UIStoryboard 
                        storyboardWithName:@"Main" bundle:nil];

就可以了,书上什么关系都没说,为什么这么写也没说提。采用这种硬编码的方式,如果文件名换了,很容易报错。
(那本Objective-C的书虽然历史悠久,但是非常经典;而国内写的书都好粗糙,为了赚钱而写的,比较多吧。)
SO,为什么这么改就OK了呢?看一下配置文件吧:

storyboard

P149我们仍然可以看到作者的硬编码行为,这在Xcode6.3上面需要修改代码:
self.page1.frame = CGRectMake(0.0f, 0.0f, 320.0f, 420.0f);
这个例子我弄了个Demo,有兴趣可以去下载:
PageController Demo2

P163视图到视图的push方式已经被定为废弃的方式,换成新的方法:

Push Deprecated

还有,作者这坑爹的:
[“然后按住control键从上一个Table View Controller拖动鼠标到当前添加的Table View Controller,从弹出界面中选择push”,这样做并不能使程序运行,应该是“按住control键从上一个Table View Controller的TableViewCell拖动鼠标到当前添加的Table View Controller”。]
如果要使用“Show”的方式的话,你可以这么做:

将按钮和控制器连接起来,选择show方式

然后,在代码中,这么处理:

- (void)showViewController:(UIViewController *)vc sender:(id)sender {

    NSLog(@"123");
    [self presentViewController:vc animated:YES completion:^{

    }];
}

P174的设计模式,讲的一般般~如果去面试的话,被面试官问到,估计根据书中写的东西,你也答不清楚。
关于设计模式的内容。标记,有待解决!

P193讲到MVC模式:
模型。
保存应用数据的状态,回应视图对状态的查询,处理应用业务逻辑,完成应用的功能,将状态的变化通知视图。

视图。
为用户展示信息并提供接口。用户通过视图向控制器发出动作请求,然后再向模型发出查询状态的申请,而模型状态的变化会通知给视图。

控制器。
接收用户请求,根据请求更新模型。另外,控制器还会更新所选择的视图作为对用户请求的回应。控制器是视图和模型的媒介,可以降低视图与模型的耦合度,使视图和模型的权责更加清晰,从而提高开发效率。

P200在Xcode6.3中,这种两套的storyboard已经被整合在一起了。

P204如何修改ViewController的大小呢,看下图:

修改ViewController的大小

不过这样的设定貌似在Xcode6.3上面不起作用,要怎么做呢?,解决不了。标记,有待解决!

P207在Xcode 6.3中SplitViewController已经发生改变了。控制器都帮你创建好了,你不用自己创建。听喵神说这个控制器的8.0API增加了不少方法。

P210“关于获得DetailView的根视图控制器方法,有的读者会想到通过Storyboard ID得到,类似于下面的代码:

DetailViewController * detailViewController = [self.storyboard
instantiateViewControllerWithIdentifier:@" detailViewController "];

很多情况下,我们都是这样获得故事板中的视图控制器的。但是注意:使用上面的代码,我们的确可以创建一个新的视图控制器,可是这个新的视图控制器对象不是应用程序初始时创建的。”

P216系统架构层

系统架构

“游戏开发一般都会采用引擎。事实上,游戏引擎包含了架构设计解决方案,但其架构一般不是分层的,而是树形结构的。”

P220中增删改查,应该是insert、delete、update、search,作者称呼为CRUD,哪里想出来的。。。DUIS比较好听。
另外,增删改最好是返回布尔对象,表示操作是否成功比较好,作者返回int不知道是几个意思。
想到这个增删改查,想起了Java的三大框架,天天做增删改查。。。

“有时候,我们需要将某一层复用给其他的团队、公司或者个人,但由于某些原因,我们不能提供源代码,此时就可以将业务逻辑层和数据持久层编写成静态链接库(static library或statically-linked library)。”

“库是一些没有main函数的程序代码的集合。除了静态链接库,还有动态链接库,它们的区别是:静态链接库可以编译到你的执行代码中,应用程序可以在没有静态链接库的环境下运行;动态链接库不能编译到你的执行代码中,应用程序必须在有链接库文件的环境下运行。”

P224的Add Copy Headers Build Phase在这里:

New Headers Phase

然后按照作者说的添加头文件就行了。另外,怎么将最后一个Project加入Work Space中呢:

将Project加入Work Space中

不过,我工程一直运行不成功,报错(换成iPhone 4S的模拟器好像就可以了,奇怪):

BusinessLogicLayer was rejected as 
                    an implicit dependency for 'libBusinessLogicLayer.a' 

because its architectures 'x86_64' didn't contain 
                    all required architectures 'i386 x86_64'

意思应该是,libBusinessLogicLayer.a这个文件我是在Xcode 6.3中创建的,而PresentationLayer工程是直接拖的以前的,版本不一样吧。(我猜的),至于怎么解决,没找到合适的办法。。。标记,有待解决!

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

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试

关闭