我目前正在使用xcode6中的swift开发一个带有拆分视图控制器的项目。
我目前拥有它,以便当应用程序加载时,它会记住您之前选择的单元格并将“选择”该单元格。但是,当选择单元格时,它不会启动segue到详细视图控制器加载该单元格相关信息。
这是我的主视图控制器代码,想知道在应用程序加载时我可以添加什么来启动所选单元格的segue?
class MasterViewController: UITableViewController {
var detailViewController: DetailViewController? = nil
var titles = [String]()
var ageGroups = [String]()
var danceForms = [String]()
var danceDivisions = [String]()
var danceCategories = [String]()
var routineIds = [Int]()
override func awakeFromNib() {
super.awakeFromNib()
self.clearsSelectionOnViewWillAppear = false
self.preferredContentSize = CGSize(width: 320.0, height: 600.0)
}
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.setRightBarButtonItems([rightAddBarButtonItem,rightSearchBarButtonItem], animated: true)
let query = PFQuery(className: "Schedule")
query.orderByAscending("routineId")
query.whereKey("eventId", equalTo: 16)
query.findObjectsInBackgroundWithBlock { (objects, error) -> Void in
if let objects = objects {
for object in objects {
self.titles.append(object["title"] as! String)
self.ageGroups.append(object["ageGroup"] as! String)
self.danceForms.append(object["danceForm"] as! String)
self.danceDivisions.append(object["danceDivision"] as! String)
self.danceCategories.append(object["danceCategory"] as! String)
self.routineIds.append(object["routineId"] as! Int)
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.tableView.reloadData()
var returnValue: Int? = NSUserDefaults.standardUserDefaults().objectForKey("selectedCell") as? Int
if let value = returnValue{
}
else{
returnValue = 1;
}
if returnValue! > self.routineIds.count{
returnValue = 1;
}
let rowToSelect:NSIndexPath = NSIndexPath(forRow: returnValue!-1, inSection: 0); //slecting 0th row with 0th section
self.tableView.selectRowAtIndexPath(rowToSelect, animated: true, scrollPosition: UITableViewScrollPosition.None);
})
}
}
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
// MARK: - Segues
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "showDetail" {
if let indexPath = self.tableView.indexPathForSelectedRow() {
let object = routineIds[indexPath.row] as Int
let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailViewController
controller.detailItem = object
controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem()
controller.navigationItem.leftItemsSupplementBackButton = true
}
}
}
// MARK: - Table View
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return titles.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("scheduleCell", forIndexPath: indexPath) as! scheduleCell
var myCustomSelectionColorView = UIView()
myCustomSelectionColorView.backgroundColor = UIColor.whiteColor()
cell.selectedBackgroundView = myCustomSelectionColorView
cell.routineId.text = "\(routineIds[indexPath.row])"
cell.routineTitle.text = titles[indexPath.row]
cell.routineAgeGroup.text = " - \(ageGroups[indexPath.row])"
cell.routineDanceForm.text = " - \(danceForms[indexPath.row])"
cell.routineDivision.text = danceDivisions[indexPath.row]
cell.routineCategory.text = danceCategories[indexPath.row]
return cell
}
override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
// Return false if you do not want the specified item to be editable.
return false
}
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
println(routineIds[indexPath.row])
NSUserDefaults.standardUserDefaults().setInteger(routineIds[indexPath.row], forKey: "selectedCell")
NSUserDefaults.standardUserDefaults().synchronize()
var returnValue: Int? = NSUserDefaults.standardUserDefaults().objectForKey("selectedCell") as? Int
if returnValue! == 1{
}
println(returnValue)
}
答案 0 :(得分:2)
您可以使用UIViewController上的performSegueWithIdentifier方法手动启动segue。
// in your dispatch_async block:
self.performSegueWithIdentifier("showDetail", self)
答案 1 :(得分:2)
另一种方法是利用state restoration。好处是应用程序可以恢复每个视图控制器的状态,而无需编写或处理您现在所做的大部分工作。
状态恢复将为您保存并加载应用程序状态,使您无需保留NSUserDefaults
中的详细信息,例如选择了哪个单元格。 SDK实际上保留了大量有用的详细信息,例如您的splitViewController
是折叠还是展开,导航栏是否紧凑或隐藏等等。这些都是很好的触摸,当您使用它们时,它们是免费的使用状态恢复。
要利用状态恢复,您需要:
让您AppDelegate
实施application:shouldSaveApplicationState:
和application:shouldRestoreApplicationState:
为要保留的每个视图控制器分配恢复标识符。您可以在Storyboard中轻松完成此操作。
从application:willFinishLaunchingWithOptions:
显示您应用的窗口。
使用encodeRestorableStateWithCoder:
和decodeRestorableStateWithCoder:
另一个好处是视图控制器可以保存自己关于它正在显示的对象的详细信息,而另一个视图控制器不需要执行任何segue(或传递任何细节)。它允许您的视图控制器更加独立,并且与其他视图控制器的耦合程度更低。
状态恢复确实减少了您必须编写的代码量,从长远来看,这需要维护,支持和升级应用程序。