现在我们进入正题:
1.创建一个SingleView(单视图)应用
2.选择Swift为开发语言,并为项目命名
3.点击Main.StoryBoard,然后选中默认视图并删除它
4.从Xcode右下角的Object Library选中SplitViewController并将它拖拽到Main.StoryBoard的面板中
5.使用属性设置将SplitViewController设置为第一个启动的ViewController
6.把导航栏加入到界面控制器中去,具体做法是:选择Editor->Embed In->Navigation Controller
7.将自动生成的
ViewController.swift文件重命名为
DetailViewController.swift 并将类名改变为
DetailViewController
8.在界面控制器中将对应类文件的名称从ViewController换为DetailViewController
9.用Ctrl选中SplitView自动生成的TableView(Root View Controller)的一个Cell,然后将其拖拽到Detail View Controller上去,并在弹出的黑色菜单上选择"Show Detail",这时在RootViewController和DetailViewController中会形成一个连接线,其实这个就是一个Segue,用来导航Controller的,点击这个线并将Identifier的名字设置为showDetailIdentifier,为什么这样做再后期会知道,现在这里就理解为:我们给这个导航过程起了一个名字,为的是在茫茫众多的导航过程(Segue)中找到我们要找的那一个。
10.然后 我们去Root View Controller那里,其实就是一个TableView,然后给TableView的Cel设置一个可复用的ID,如“cellid"
11.随后在项目中创建一个新的CocoaTouch文件
12.并给这个文件命名为"SplitViewController",并将其父类设置为“UISplitViewController”(原文这里的贴图有误导性,暂时就不贴了)
13.然后在SplitViewController.swift这个文件里的viewDidLoad方法中加入如下一行代码:
splitViewController?.preferredDisplayMode = .PrimaryOverlay
这行代码是保证TableViewController在DetailViewController之上。你也可以更换其他的设置,此处是一个枚举,源码如下:
enum UISplitViewControllerDisplayMode : Int {
case Automatic
case PrimaryHidden
case AllVisible
case PrimaryOverlay
}
在创建一个文件,命名为ListTableViewController 他的父类继承自UITableViewController
然后在故事板中,将对应的Class设置为
ListTableViewController
随后在DetailView中加一个居中的Label,显示对应的数字用的。
然后在DetailView.swift中给这个Label创建一个实例,
IBOutlet
,代码如下:
@IBOutlet var numberLabel:UILabel?
再添加一个属性名为 selectedIndex,这个属性在跳转时会被调用。
var selectedIndex:Int = 1
并修改
DetailView.swift的
viewDidLoad
方法,主要作用是给label设置文本属性并给导航栏加入返回按钮
override func viewDidLoad() {
super.viewDidLoad()
numberLabel?.text = “\(selectedIndex)“
// add back button to the navigation bar.
if splitViewController?.respondsToSelector(“displayModeButtonItem”) == true {
navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem()
navigationItem.leftItemsSupplementBackButton = true
}
}
然后再ListTableView.swift中加入数据源,是一个数组,并且初始化对应的tableview的数据
let names = [“One”,“Two”,“Three”,“Four”,“Five”,“Six”,“Seven”,“Eight”,“Nine”,“Ten”] (class level declaration)
// MARK: – Table view data source
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return names.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier(“CellIdentifier”, forIndexPath: indexPath) as UITableViewCell
cell.textLabel?.text = names[indexPath.row]
return cell
}
然后再加入跳转方法,让选定的tableview的行数在跳转时传入到下一个界面中去
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if (segue.identifier == “ShowDetailIdentifier”) {
var detail: DetailViewController
if let navigationController = segue.destinationViewController as? UINavigationController {
detail = navigationController.topViewController as DetailViewController
} else {
detail = segue.destinationViewController as DetailViewController
}
if let path = tableView.indexPathForSelectedRow() {
detail.selectedIndex = path.row + 1
}
}
}
此处下载源码:https://github.com/rshankras/UISplitViewControllerExample