根据按下的按钮将数据传递给tableViewController

时间:2017-06-23 15:23:06

标签: iphone swift uitableview uiviewcontroller delegates

我是swift的初学者,但我确实在HTML,CSS和Java方面有着不错的背景。我把这个帐号简单地问了这个问题,所以我会直截了当地说。

我真的很享受快乐,但我真的花了一周时间一遍又一遍地写这个相同的代码,回顾无数的教程,书籍,指南等等。无济于事;而且我不会撒谎,我总是厌倦了在我的编译器中看到10多个错误堆积起来,因为我一直试图解决这个问题。

我有一个ViewController,我有一个TableViewController - ViewController是我的主屏幕。在所说的viewController上,我有两个按钮,一个是BuildingItems,另一个是BuildingBlocks。两者都是segues。

在我的TableViewController上,我有buildBlocks和buildItems,两者都定义了它们的数组。

我试图做的,取决于用户选择的按钮,我希望那时是用于填充我的tableview的数据。我可以使用普通的cell.textLabel?.text = arrayNameHere [indexPath.row]来专门填充tableview,但显然这并不能解决我的问题。

我希望你能在这里帮助我。我为蹩脚的语法和格式道歉,我已经花了4-5个小时,这一周过去一周试图让这个工作,我结束了生气,并删除我的整个项目三个不同倍。我将在下面提供代码。再次,原谅格式化。我不知道为什么我似乎无法迅速解决问题,我一直在尝试代表的每一个变体试图通过一些让它起作用的东西,但没有任何工作。

ViewController:

@IBAction func BuildItems (_sender: Any) {
}

@IBAction func BuildBlocks (_sender: Any) {
}

在TableViewController中:

    let buildItems = ["these are all my", "arrays for this"]

    let buildBlocks = ["same thing here","just saving time"]

    class TableViewController: UITableViewController {

        var myIndex = 0

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

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "cell" for: indexPath)

        cell.textLabel?.text = buildItems[indexPath.row]

        return cell
    }


    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        myIndex = indexPath.row

    }
}

3 个答案:

答案 0 :(得分:0)

在tableView控制器中创建bool var可能和helpArray

var dataArray:[String] = []
var isBuildItem:Bool = false

在你的第一个控制器中实现prepareForSegue方法,如下所示:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let vc = segue.destination as? TableViewController {
             //set true or false it depends of which button you click
             vc.isBuildItem = //true or false
        }
}

然后在TableViewController中的viewDidLoad中检查bool变量

if(isBuildItem:Bool){
    dataArray = buildItems
}
else{
    dataArray = buildBlocks
}

在所有tableView委托方法中,使用dataArray

更改buildItems数组

答案 1 :(得分:0)

在ViewController中

import UIKit

var segueName = ""

class ViewController: UIViewController {

    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 prepare(for segue: UIStoryboardSegue, sender: Any?)
    {
        segueName = segue.identifier!
        print(segueName)
    }

}

TableViewController:

import UIKit

class TableViewController: UITableViewController
{
    let animals = ["Cat","Dog","Mouse"]
    let colors = ["White","Blue","Red"]
    var arrayResult = [""]


    override func viewDidLoad()
    {
        super.viewDidLoad()

        if segueName == "seguebuttonA"
        {
            arrayResult = animals
        }
        else if segueName == "seguebuttonB"
        {
            arrayResult = colors
        }
    }

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

    // MARK: - Table view data source

    override func numberOfSections(in tableView: UITableView) -> Int
    {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
    {
        // #warning Incomplete implementation, return the number of rows
        return arrayResult.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
    {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cellTest", for: indexPath) as! TableViewCell

        // Configure the cell...

        cell.titleLabel.text = arrayResult[indexPath.row]

        return cell
    }
}

添加segue名称: enter image description here

完整的例子在下面的链接中,我希望我有所帮助,如果您有任何问题请告诉我。 https://github.com/cwilliams26/viewSegueTabelview/tree/master

答案 2 :(得分:0)

您只需要1个segue:从ViewControllerTableViewController

在你的ViewController创建一个按下按钮的变量:

var category = ""

按下按钮时更改值,然后按segue:

@IBAction func BuildItems (_sender: Any) {
    category = "BuildItems"
    self.performSegue(withIdentifier: "segue", sender: self)
}

@IBAction func BuildBlocks (_sender: Any) {
    category = "BuildBlocks"
    self.performSegue(withIdentifier: "segue", sender: self)
}

然后在prepare

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "segue" {
        let vc = segue.destination as! TableViewController
        // Assuming you created a variable called sentCategory in the TableViewController
        vc.sentCategory = category
    }
}

TableViewController中创建一个空数组:

let data = [String]()

viewDidLoad

if sentCategory == "BuildItems" {
    data = buildItems
} else {
    data = buildBlocks
}

使用TableView变量填充data

一对评论:

  • 将所有内容保留在您的课程范围内,除非您有充分的理由不这样做。
  • 在这种情况下,您不需要代理人。使用prepare函数传递数据,如上所示。