在Swift中将TableView数据传递给DetailViewController

时间:2016-03-11 16:41:29

标签: swift

我有一个简单的tableview加载颜色数组(每个单元格具有不同的颜色)。我试图传递detailViewController的背景颜色当用户从colourTableviewcontroller按下颜色数组单元格时(我只想将单元格颜色传递为细节视图背景颜色) 我的代码如下.....

import UIKit 

class colourTableviewcontroller: UITableViewController {

@IBOutlet weak var colorTableView: UITableView!

let colors = [UIColor.redColor(), UIColor.blueColor(),UIColor.greenColor(), UIColor.orangeColor(),UIColor.purpleColor(),UIColor.yellowColor(),UIColor.cyanColor(),UIColor.darkGrayColor(),UIColor.blackColor(), UIColor.brownColor(),UIColor.grayColor(), UIColor.magentaColor(), UIColor.whiteColor()]

var colourData = UIColor()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

override func viewDidAppear(animated: Bool) {
   colorTableView.separatorColor = UIColor.clearColor()
}

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return colors.count
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("colourCell", forIndexPath: indexPath) as UITableViewCell

    cell.backgroundColor = self.colors[indexPath.row % self.colors.count]

    return cell

}

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    colourData = self.colors[indexPath.row]
    performSegueWithIdentifier("colourSegue", sender: self)

}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if (segue.identifier == "colourSegue") {

 let viewController = segue.destinationViewController as! DetailViewController

 viewController.bc?.backgroundColor = colourData }
}}                  

 // My DetailViewController as follows...
 import UIKit
 class DetailViewController: UIViewController {
 @IBOutlet var bc: UIView!

 override func viewDidLoad() {
 self.bc.backgroundColor = UIView.appearance().backgroundColor
 }

当我运行代码时,当我按下颜色数组时,我的DetailViewController背景颜色变为深色文本颜色.....

我不知道我错过了什么,或者我做错了方法/逻辑......

先谢谢.....

3 个答案:

答案 0 :(得分:1)

  • 首先在ColourTableviewcontroller中将segue连接到表格视图单元而不是视图控制器并删除方法didSelectRowAtIndexPath

  • prepareForSegue替换为

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "colourSegue" {
           let viewController = segue.destinationViewController as! DetailViewController
           let selectedIndexPath = tableView.indexPathForCell(sender as! UITableViewCell)
           viewController.color = colors[selectedIndexPath.row]
        }
    }        
    
  • DetailViewController中声明变量color

    var color : UIColor!
    
  • 并在bc

    中设置viewDidLoad()的颜色
    bc.backgroundColor = color
    

附加变量的原因是IBOutlets中的DetailViewController在执行prepareForSegue时尚不存在。

答案 1 :(得分:1)

您没有通过UIColor并在下一个View Controller中分配

您只需对现有代码进行一些修改

1)在DetailViewController中添加var recievedColor : UIColor!

2)在您的prepareForSegue中,将viewController.bc?.backgroundColor = colourData 替换为 viewController.recievedColor = colourData

3)在您的DetailViewController中,在viewDidLoad()函数中,将self.bc.backgroundColor = UIView.appearance().backgroundColor 替换为 self.bc.backgroundColor = recievedColor

你去吧!

enter image description here

答案 2 :(得分:0)

您需要传递颜色,然后将颜色指定给viewDidLoad()上的视图。您正在为尚未初始化的视图指定变量。

您的详细课程中的

执行如下操作:

 class DetailViewController: UIViewController {
 @IBOutlet var bc: UIView!
 var selectedBackgroundColor: UIColor? // this should be set on the prepareForSegue method.

 override func viewDidLoad() {
   super.viewDidLoad()

   if let selectedBackgroundColor = selectedBackgroundColor {
     bc.backgroundColor = selectedBackgroundColor
   }     
 }

希望这有帮助!