转载

New StoryBoard in iOS9

Storyboards在iOS5就已经添加进来了,被开发者们指点了很多年了,如今他也添加了不少的新的功能。Apple现在是鼓励开发者们使用Storyboards来进行页面的开发的,虽然一直还没有完全那些代码写界面的所接受,但是我觉的这将会是以趋势。

再开始之前我觉的你可以先去看下这个视频,这是WWDC2015上关于这部分的介绍。这个视屏字幕是翻译成中文的。 视频链接

项目初始地址

Storyboard references

如果你已经看过了上边的那个视频,那么你就会知道 Storyboard references 这个功能有多么棒。

如果你曾经使用 interface builder 创建过一个复杂、界面非常多的应用,你就会明白最后那些 Storyboards 文件变的有多大。他会迅速变的无法管理,阻碍你的进度。自从引入 Storyboard 以来,其实是可以把你的应用的不同模块切开到不同的 Storyboard 中的。在过去,这要手动创建多个 Storyboard 文件,并且要写大量的代码。

为了解决这个问题,在 iOS 9 中苹果介绍了 Storyboard References 这个概念。 Storyboard References 允许你从 segue 中引用其他 storyboard 中的 viewController 。这意味中你可以保持不同功能模块化,同时 Storyboard 的体积变小并易与管理。不仅容易理解了,和团队一起工作时,合并(工作成果)也变的简单了。

Creating your first storyboard reference

打开我们的项目来创建你的第一个 storyboard reference ,打开 Main.storyboard ,选择除了 tar bar controller 之外的所有视图控制器,然后选择 Editor/Refactor to storyboard And 输入 Checklists.storyboard 作为这个新的故事版的名称。然后点击存储。

你的新的故事版的样子应该是下边这个样子:

New StoryBoard in iOS9

而你的原来的故事版将会是这个样子:

New StoryBoard in iOS9

接下来我们在 Main.storyboard 中选择名字是 ChecklistsNavigationControllerreferences 在属性面板中删除 Referenced ID 里的值。

New StoryBoard in iOS9

修改之后就回变成下边的样子

New StoryBoard in iOS9

打开你的 Checklists.storyboard 选择 Checklists Navigation Controller 在属性面板中选中 Is Initial View Controller

New StoryBoard in iOS9

我们也可以从 Object Library 中拖进来一个 Storyboard reference 控件。

Views in the scene dock

在我们项目中的 ChecklistDetail.storyboard 中选择 Checklist Detail View Controller ,从 Object Library 拖出一个 View 放在 secne dock

New StoryBoard in iOS9

你会不会吓一跳。可是你会想,额。我们怎么去使用它呢。我们先来一个简单的使用吧。

选中这个 View 在属性栏中将背景颜色设置为 #FFFAE8

ChecklistItemCell 拖出 Ctrl-drag 到你的这个view中,选择 selectBackgroundView

New StoryBoard in iOS9

然后你运行你的项目,点击任何cell

New StoryBoard in iOS9

Conditional views using the scene dock

我们经常会想创建一个只需要在特定条件下才显示的 view 。我们可以使用 scene dock 来方便的实现这一点。

我们仍然在 ChecklistDetail.storyboard 中拖进来一个 Viewscene dock 中,将刚才的那个设置过背景颜色的 View 的宽高设置为 321 ; 128

在这个新的 View 中拖进来一个 labeltext View 。设置 label 的文字是 notes ,颜色设置为 #BB991E

New StoryBoard in iOS9

textView 的属性中 editableselectable 不要勾选。就像下边的这个样子:

New StoryBoard in iOS9

接下来我们在代码中将新添加进来的 view 和这个 textView 做一个关联。

ChecklistDetailViewController.swift 中添加两个方法,一个是用来显示新添加进来的 View 另外一个自然是移除了。

   func addNotesViewToCell(cell:ChecklistItemTableViewCell){  notesVIew.heightAnchor.constraintEqualToConstant(notesViewHeight).active = true  notesVIew.clipsToBounds = true  cell.stackView.addArrangedSubview(notesVIew) } func removeNotesView(){  if let stackview = notesVIew.superview as? UIStackView{   stackview.removeArrangedSubview(notesVIew)   notesVIew.removeFromSuperview()  } } 

上边的方法可以确保自动布局定义笔记的高度,然后将其添加到对应的单元格中,他还设置了 clipsToBounds 为true,以防止文本视图从 cell 中外溢。

接下来就是使用这两个方法了。在 ChecklistDetailViewController.swift 中完成下边的方法。

 override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {  //1  guard let cell = tableView.cellForRowAtIndexPath(indexPath) as? ChecklistItemTableViewCell else {return}  //2调用这个方法来以动画更改单元格的高度  tableView.beginUpdates()  //3 如果cell的stackView已经包含了它则删除,如果没有则添加  if cell.stackView.arrangedSubviews.contains(notesVIew){      removeNotesView()  }else{      addNotesViewToCell(cell)      notesTextView.text = checklist.items[indexPath.row].notes  }  //5 最后来条用这个方法来提交更改。  tableView.endUpdates()     }  

接下里运行你的程序就会看到下边的效果。

New StoryBoard in iOS9

Using multiple bar buttons

在故事版中给 Checklist Detail View Controller 拖进来两个 bar button item 放在 navigation bar 的右边,给其中一个的图片设置为 AddButtonicon

New StoryBoard in iOS9

add button拖拽出一天线到 add item navigation controller 从弹出来的菜单中选择 present modally 。这样的话我们点击 add button 则会弹出一个新的界面。

接下来我们需要给我们弹出的界面添加消失的功能。

checklistDetail.storyboard 中选择 add item view controller ,从 Cancel 按钮中拖出一条线到 Exit ,从弹出的菜单中选择 cancelToChecklistDetailViewController

同样的方法给 save 按钮添加 saveToChecklistDetailViewController

运行一下程序来看下效果吧。

New StoryBoard in iOS9

我们在最后的最后来添加删除 cell 的功能。

ChecklistDetailViewController.swift 中完成下边的方法。

viewDidLoad中添加

navigationItem.rightBarButtonItems![1] = editButtonItem()

重写下边的方法

override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {         if editingStyle == .Delete{             removeNotesView()             checklist.items.removeAtIndex(indexPath.row)             tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)         }     }

New StoryBoard in iOS9

正文到此结束
Loading...