这个文章是“如何创建一个简单iPhone应用”三部曲的第二部分,这个三部曲主要针对初学者。这个应用是评比最吓人虫子的应用。
在 第一部分, 我们创建了一个应用,它在table view中包含了一系列虫子。
在这个部分文章中,我们会学习如何创建一个详细视图(detail view),在那里可以查看虫子的大图片,给它们打分,替换它们的图片!
在三部曲的 第三部分 , 我们会学习如何添加一个新虫子,给我们工程添加一个图标和缺省图片,和怎么处理长时间运行的操作。
那么让我们开始弄些虫子吧!毕竟,无论什么程序都会有bug吗?:]
现在我们有了一列虫子了,如果点击一个虫子,就弹出一个屏幕可以编辑虫子的名字,图片,评分,那就更好了。
大部分情况下,在iPhone应用中,每一个"界面"(“screen”)都有一个“View Controller”类的对象代表那个界面。现在我们MasterViewController在启动时显示出来了,它包含了一个table view. 我们想当点击一个虫子时,它会打开DetailViewController, 显示这个虫子的一些信息。
当我们第一次运行这个模板工程时,它可以工作,但当我们改变了显示在table view的对象后,点击table view的某一行不再发送正确的对象给detail view(这是我们的bug,不是XCode’s NSDate 工程模板的bug)。我们会回头修复它。
每一个“View Controller”可以包含多个view。在我们的table view controller, 我们只有一个view – table view. 然而在我们的details view controller, 我们需要一组view – 一个view显示虫子的名字,一个view显示图片,一个view用来评分,和其他的一些view。
说起这个,在详细内容里我们需要一个5星评分视图,但是iPhone默认没有提供。不过我最近写了一个名为《在iOS5里怎样创建自定义UIView:一个5星评分视图》的教程,所以我们在这里重复使用这个教程。
不要太担心这个教程(除非你喜欢这个教程)–相反你只需要下载我放在项目里的 Extra Stuff for Scary Bugs这个包。
继续,下载了这个包之后:
好了 – 现在我们终于准备好开始了! 打开MainStoryboard.storyboard, 如果你将滚动条拉到足够靠右的位置,你会看到模板为我们默认生成了Detail View Controller,并且带有一个内容为“Detail view content goes here” 的标签:
Storyboard编辑器提供了一种可视化的方式,以方便你用XCode构建UI。你可以把UI元素拖放到你的视图上,用你想要的方式设置它们的属性值,甚至你可以在View Controller类里把元素连接到属性。
理解这些最容易的方式是亲自试一下!首先,在view controller上点击一下,并且打开EditorCanvasShow Bounds Rectangles(译者注:指的是菜单栏上的Editor) – 这样我们在屏幕上布局控件的时候会容易些。
删除内容为“Detail view content goes here”的标签 – 我们不需要它!
然后来看面板的右下部分,确保Object Libray的第三个选项卡是被选择了的。拖拽一个UITextField,UIImageView和一个UIView到文字屏幕上并如下图所示安排(文字栏Text Filed在上方)
然后选择侧边栏上部的UITextField,确保第四个选项卡(属性检查工具)被选择,如此我们可以修改某些属性。
设置字体为CustomHelveticaBoldSize 18.0,文字居中,当编辑时,清除按钮的行为是"Appears While Editing",Capitalzation选择Words,如下
然后,点击第四个选项卡转到尺寸检查工具(Size Inspector)设置自动大小调整属性。如下
这样当我们的视图(View)旋转到横向显示时,文本框(Text Field)在屏幕上伸展会变得更宽。
下来让我们设置UIImageView. 在等四个tab页(Attributes Inspector) 设置模式为“Aspect Fit”, 在第四个tab (Attributes Inspector) 和第五个tab (Size Inspector) 设置自动缩放(autosizing) 属性为下面的值:
这会使Image View放大或者缩小时,在保持它的边界到屏幕的边界的距离不变的同时,按照图片的宽高比来缩放图片尽可能的填充可用的空间。
对于UIView, 跳转到第三个tab (Identity Inspector)设置类标示(Class Identity)为“RateView”,我们的五星评分view将显示在那里。然后再第五个tab (Size Inspector) 设置自动缩放(autosizing)属性为下面的值:
这使它缩放时,在保持一样的高度的情况下,左右拉伸。
到现在为止,一切都很棒!下来我们需要添加一些控件到屏幕上,这样用户可以点击UIImageView区域来改变图片。
我们有好几个办法来做实现这个功能,但最简单的一个是创建一个不可见的按钮覆盖在UIImageView上面, 然后设置好按钮点击时的回调函数。我们还可以添加一个UILabel 在图片底层,当没有图片显示时,这个UILabel显示“点击改变图片”(“Tap to Change Picture”).
所以从库里拖拽一个圆角矩形按钮(Round Rect Button),然后调整坐标和UIImageView一样。为了使它不可见,在第四个tab(Attributes Inspector) 修改类型为Custom。然后在第五个tab (Size Inspector)设置自动大小属性为下面的值:
最后,从库里拖拽一个UILabel, 放在UIImageView中间, 然后双击它编辑文本为"点击改变图片"(“Tap To Change Image.”) 然后修改文本对齐属性(text alignment)为居中(center). 同样在XIB中拖拽UILabel向上几个位置使它可以在UIImageView后面 (这个列表顺序是从底层到上层):
然后在第五个tab (Size Inspector) 设置自动大小(autosizing)属性为下面的值:
往下进行前,你可以通过下面的方法再次检查所有的自动大小(autosizing)属性已经正确设置。先选择Detail View Controller, 然后在第四个tab (Attributes Inspector) 把方向从纵向的肖像方式(Portrait)修改为横向的风景画方式( Landscape):
如果有些地方不对的话,不要担心 – 只需要修改回肖像方式(Portrait)然后再次仔细检查设置。
酷! 我们已经添加完所有需要的控件,然后我们需要把这些控件和我们类中相应的outlet关联起来。
首先,我们要先切换到助手编辑器(Assistant Editor) (点击顶上工具栏“Editor” 段下的第二个按钮), 要确保它设置为AutomaticDetailViewController.h:
然后按着control键,同时鼠标左键拖拽UITextField到DetailViewController.h, 在@end之前释放. 然后会弹出一个弹出窗口让你把UITextField关联到你的类中的一个属性。在名字(Name)编辑框里输入titleField, 然后点击 Connect按钮.
重复同样的步骤,关联image view (但是关联的outlet命名为imageView),关联Rate View (但是关联的outlet命名为rateView).
我们同样想当按钮点击时,关联到一个我们类的方法被回调。为了实现这个功能,按control键同时,左键拖拽按钮到@end之前 — 就像你关联其他view一样的操作—然而这次connection下拉列表选择Action,在name编辑框输入 addPictureTapped, 然后点击Connect按钮.
注意,事件(Event)下拉框缺省选择为“Touch Up Inside”。这个缺省选项是对的,因为这意味着,当用户的手指在按钮里面抬起时 (也就是,他们点击了这个按钮), 我们的方法被调用。
你也可以关联其他动作(actions)到回调函数。例如,在文本框的文字改变时会触发一个动作,我们想这时触发一个回调函数。
为了实现这个功能,按control键,拖拽UITextField到@end之前,在弹出窗口,同样设置为动作(Action). 缺省的事件(event)设置为Editing Did End – 修改它为Editing Changed. 修改这个方法的名字(Name)为titleFieldTextChanged, 然后点击Connect按钮.
我们最后要做的一件事是设置我们的类为文本框的委托(delegate)。有时只是接收view的动作的回调是不足够的 - 这些view可能还有些其他信息需要告诉我们,例如这次的文本框就是个例子。
为了实现这个功能,按control键同时点击Text Field,然后从弹出菜单的"delegate"菜单项的右边的小圆圈拖出一条线到Detail View Controller, 然后释放.
在这时,你的DetailViewController.h应该看起来像下面这样:
#import <UIKit/UIKit.h> @interface DetailViewController : UIViewController @property (strong, nonatomic) id detailItem; @property (strong, nonatomic) IBOutlet UILabel *detailDescriptionLabel; @property (weak, nonatomic) IBOutlet UITextField *titleField; @property (weak, nonatomic) IBOutlet RateView *rateView; @property (weak, nonatomic) IBOutlet UIImageView *imageView; - (IBAction)addPictureTapped:(id)sender; - (IBAction)titleFieldTextChanged:(id)sender; @end你可能注意掉上面有一些特别的类型 – IBOutlet 和 IBAction. 为了关联我们在inerface builder添加的控件到我们类的属性,Storyboard编辑器会查找的 “神奇关键字”。基本上,如果我们把 IBOutlet 或者 IBAction 添加在属性或者方法声明中,Interface Builder 就会探测它们,后续用于联接。 本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接。 2KB翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务