这里发生的是iTunes对歌曲和专辑使用不同的键。因此所有这些域应该声明为可选的,并且我们应该检查它们至少它们其中一个被保存。如果你选择使用不同的媒体类型,这对于你的应用会是非常重要的。
最终格式化我们所有信息和验证它们都存在后,我们创建一个新的唱片集,并且添加到我们的唱片集数组中来:
1 | var newAlbum = Album(name: name!, price: price!, thumbnailImageURL: |
2 | thumbnailURL!, largeImageURL: imageURL!, itemURL: itemURL!, |
既然都处理完了,我们重新加载我们的表视图,然后关掉网络监视器。 1 | self.appsTableView.reloadData() |
2 | UIApplication.sharedApplication().networkActivityIndicatorVisible = false |
创建第二个视图
现在需要显示一个唱片集的详细信息了,我们需要一个新的视图。首先我们创建这个类。添加一个叫做DetailsViewController.swift并继承自UIViewController的文件。
我们的视图控制器将非常简单。我们只需添加一个album,然后实现UIViewController的init和viewDidLoad方法即可。 03 | class DetailsViewController: UIViewController { |
07 | init(coder aDecoder: NSCoder!) { |
08 | super .init(coder: aDecoder) |
11 | override func viewDidLoad() { |
这段代码没有做多少,但是没关系。我们需要这个类以便设置我们的storyboard。
既然我们会在栈中向后向前推视图,那我们一定需要一个导航栏。很难用文字解释,并且有保密协议不允许我展示Xcode 6截图,因此取而代之,我创建了一个短视频来展示怎样在Xcode 5中做这些。这一个过程跟在Xcode 6 Beta 中几乎一样,并且不受保密协议的约束。
在这段视频里,我们完成了以下工作: 使用编辑菜单中的Xcode快捷键在控制器导航里嵌入了我们创建的视图控制器:点击试图控制器,然后选择编辑-〉嵌入-〉控制器导航 添加了新的视图控制器 设置DetailsViewController对应的类和storyboard ID。 把我们最先创建的视图控制器里的表格单元视图通过Ctrl、点击加上拖拉到我们刚创建的心得视图控制器里,接着选择segue类型为'push'。
最后一步所做的事情就是在控制器导航上创建一个segue,它将新的视图放在堆栈的最顶端。此时运行这个一下这个应用,然后点击单元格,你将能够看到动态载入了新的视图。
接着我们给新的视图增加一个简单的UI。这个UI将包括100x100像素的UIImageView,一个标题,一个按钮和一个文本视图。从对象库中拖拉出上面所说的所有对象,然后在新的视图上按照自己的意愿对这些对象进行布局。在创建这个UI之前,请注意:XCode6有一个显示尺寸分类的概念。为了达到我们的目标,我们需要设置显示尺寸分类为iPhone。这时在显示窗口的底部,你将可以看到“宽多少,高多少”这样的描述。这就是当前storyboard的大小。如果你奇怪为什么你所创建的视图是正方形的,这就是原因所在。点击它,更改它以显示iPhone大小图片,即设置其为"宽度压缩|高度任意“。
给专辑信息提供新的视图 当启动storyboard里的segue的时候,它首先调用的时当前屏幕的视图控制器所对应的名字为prepareForSegue函数。我们将拦截这个函数调用,通过这种方式来告诉新的视图控制器我们正在查看哪个专辑。向SearchResultsViewController添加以下代码:
1 | override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject) { |
2 | var detailsViewController: DetailsViewController = segue.destinationViewController as DetailsViewController |
3 | var albumIndex = appsTableView.indexPathForSelectedRow().row |
4 | var selectedAlbum = self.albums[albumIndex] |
5 | detailsViewController.album = selectedAlbum |
这儿传入的segue参数具9有一个名字为destinationViewController的成员,它就是我们刚刚创建的DetailsViewController。为了设置专辑信息,我们首先需要使用上面代码中所示的'as'关键字把它转换为DetailsViewController。
接着,我们通过调用表格视图的indexPathForSelectedRow()方法确定运行此segue的时选择的是哪一专辑。
有了这些信息,我们就可以告诉detailsViewController在显示专辑信息之前我们点击了哪一专辑。
接下来,我们将会向你展示Xcode的一个非常强大的特性。通过使用这个特性,Xcode将会替我们编写部分代码。
再次打开storyboard,开始给图像视图、标签、按钮和文本视图创建对应的IBOutlet。在Xcode的右上角有一个"辅助“按钮。它的图标像一个带有领结的男外套。点击一下将会在storyboard窗口的右下方开启一个代码窗口。看一下是否其中一个面板显示的DetailsViewController.swift,另一个显示的是Main.storyboard。
然后,按住ctrl,接着点击并拖拉图像视图到代码文件。这时DetailsViewController类的定义下方就会出现一条横线。提示你输入名称,我们输入"albumCover"。选项就选默认的就可以了。做完这些操作后,你就会看到新增了下面这行代码: 1 | @IBOutlet var albumCover : UIImageView |
此时,我们创建了一个新的IBOutlet,并且把它与storyboard里的DetailsViewControll关联起来。非常酷吧?
然后对你添加到视图的其他对象也做同样的操作。完成这些以后,我们还要修改viewDidLoad,以便装载传递给视图对象的信息。下面是DetailsViewController代码的最终版本:
03 | class DetailsViewController: UIViewController { |
05 | @IBOutlet var albumCover : UIImageView |
06 | @IBOutlet var titleLabel : UILabel |
07 | @IBOutlet var detailsTextView : UITextView |
08 | @IBOutlet var openButton : UIButton |
12 | init(coder aDecoder: NSCoder!) { |
13 | super.init(coder: aDecoder) |
16 | override func viewDidLoad() { |
18 | titleLabel.text = self.album?.title |
19 | albumCover.image = UIImage(data: NSData(contentsOfURL: NSURL(string: self.album?.largeImageURL))) |
上面的几个@IBOutlet是由storyboard创建的UI与视图控制器之间的关联,而viewDidLoad方法则根据装载的专辑对象设置专辑标题和专辑封面。
现在,试着运行应用程序并看一下结果。我们现在可以深入探究相册的详细信息,并且得到一个与专辑封面和标题相关的详细信息视图。因为我们之前做了导入导航控制器的操作,因此我们还免费获得功能后退按钮 !
如果目前为止,你已经做到这些,请在 我的Twitter上面告诉我你已经成功完成,因为我想要亲自祝贺你!你在用Swift开发iOS应用的道路上进展不错。
下一次,我们要弄清楚一些需要放在我们大段文本字段中的东西,并且我们要让我们的按钮能在展示专辑时做一些酷酷的事情。 所以一定要注册,以便下一次通知。
这一节的完整源代码可以 在这里获得
|