Iphone 根据按下的按钮将数据传递到tableViewController

Iphone 根据按下的按钮将数据传递到tableViewController,iphone,swift,uitableview,uiviewcontroller,delegates,Iphone,Swift,Uitableview,Uiviewcontroller,Delegates,我是swift的初学者,但我在HTML、CSS和一些Java方面有不错的背景。我做这个解释就是想问这个问题,所以我会直截了当地说 我真的很喜欢swift,但实际上我花了一周的时间一遍又一遍地写同样的代码,查阅了无数的教程、书籍、指南等,但都没有用;我不会说谎,我真的厌倦了在我的编译器中看到10多个错误堆积在一起,因为我一直在努力找出答案 我有一个ViewController,还有一个TableViewController——ViewController是我的主屏幕。在上述viewControll

我是swift的初学者,但我在HTML、CSS和一些Java方面有不错的背景。我做这个解释就是想问这个问题,所以我会直截了当地说

我真的很喜欢swift,但实际上我花了一周的时间一遍又一遍地写同样的代码,查阅了无数的教程、书籍、指南等,但都没有用;我不会说谎,我真的厌倦了在我的编译器中看到10多个错误堆积在一起,因为我一直在努力找出答案

我有一个ViewController,还有一个TableViewController——ViewController是我的主屏幕。在上述viewController上,我有两个按钮,一个用于BuildingItems,另一个用于BuildingBlocks。两者都是分段的

在我的TableViewController上,我有构建块和构建项,它们都定义了它们的数组

我想做的是,根据用户选择的按钮,我希望它成为用于填充我的tableview的数据。我可以使用普通单元格.textLabel?.text=arrayNameHere[indexPath.row]专门填充tableview,但显然这并不能解决我的问题

我希望你能在这里帮助我。我为糟糕的语法和格式道歉,在过去的一周里,我每天花4-5个小时试图让它正常工作,结果我只是生气了,三次删除了我的整个项目。我将包括下面的代码。同样,请原谅格式错误。我不知道为什么我似乎不能理解swift,我一直在尝试每一种代表的变化,试图传递一些可以让它工作的东西,但什么都不起作用

视图控制器:

@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

    }
}

在tableView控制器和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
        }
}
然后在viewDidLoad中,在TableViewController中检查bool变量

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

在所有tableView委托方法中,使用ViewController中的dataArray更改buildItems数组:

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)
    }

}
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
    }
}
TableViewController:

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)
    }

}
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
    }
}
添加序列名称:

完整的例子在下面的链接中,我希望我有帮助,如果你有任何问题,请告诉我。

您只需要一个步骤:从
ViewController
TableViewController

视图控制器中
为按下的按钮创建一个变量:

var category = ""
按下按钮时更改值,然后继续:

@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)
}
然后在
准备中

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
}
使用
数据
变量填充
表格视图

有几点意见:

  • 把所有的东西都放在你的课堂范围内,除非你有充分的理由不这样做
  • 在这种情况下,您不需要委托。使用如上所示的
    prepare
    功能传递数据

我给了它一次机会,它完成了这个过程,然而,它把我带到了一个牢房,然后又带到了另一个牢房——都是无人居住的牢房。不知道为什么。尽管如此,我还是很感激你抽出时间!尝试将你的代码添加到问题或链接中,这样我就可以下载你的项目进行审查。这很有效!非常感谢你!唯一的问题是,它同时执行两段,我不太清楚为什么。我相信这是我做过的。尽管如此,非常感谢。这段时间我一直试图用艰难的方式做事。一个问题-准备和委派有什么区别?(在一个初学者可以理解的更简单的版本中)谢谢!使用“准备”功能是将数据从一个ViewController单向传递到另一个ViewController的最简单方法。委托可以用于向后或任何地方传递数据。基本上,VC可以遵守协议(委托)并监听更改。所以VC可以调用另一个VC中的方法。