swift splitview控制器默认单元格

时间:2015-06-28 22:59:00

标签: swift ipad ios8 uisplitviewcontroller

我目前正在使用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)

}

2 个答案:

答案 0 :(得分:2)

您可以使用UIViewController上的performSegueWithIdentifier方法手动启动segue。

// in your dispatch_async block:
self.performSegueWithIdentifier("showDetail", self)

答案 1 :(得分:2)

另一种方法是利用state restoration。好处是应用程序可以恢复每个视图控制器的状态,而无需编写或处理您现在所做的大部分工作。

状态恢复将为您保存并加载应用程序状态,使您无需保留NSUserDefaults中的详细信息,例如选择了哪个单元格。 SDK实际上保留了大量有用的详细信息,例如您的splitViewController是折叠还是展开,导航栏是否紧凑或隐藏等等。这些都是很好的触摸,当您使用它们时,它们是免费的使用状态恢复。

要利用状态恢复,您需要:

  1. 让您AppDelegate实施application:shouldSaveApplicationState:application:shouldRestoreApplicationState:

  2. 为要保留的每个视图控制器分配恢复标识符。您可以在Storyboard中轻松完成此操作。

  3. application:willFinishLaunchingWithOptions:显示您应用的窗口。

  4. 使用encodeRestorableStateWithCoder:decodeRestorableStateWithCoder:

  5. 对视图控制器的状态进行编码和解码

    另一个好处是视图控制器可以保存自己关于它正在显示的对象的详细信息,而另一个视图控制器不需要执行任何segue(或传递任何细节)。它允许您的视图控制器更加独立,并且与其他视图控制器的耦合程度更低。

    状态恢复确实减少了您必须编写的代码量,从长远来看,这需要维护,支持和升级应用程序。