允许用户使用来自不同视图控制器中的标签的文本创建新的 tableViewCells?

Posted

技术标签:

【中文标题】允许用户使用来自不同视图控制器中的标签的文本创建新的 tableViewCells?【英文标题】:Allow the user to create new tableViewCells with text from a label in a different viewcontroller? 【发布时间】:2018-10-04 13:00:56 【问题描述】:

因此,在 viewController1 中,我有一个文本字段和一个“保存按钮”,当用户按下“保存按钮”时,文本会保存在下面的标签中(在同一个视图控制器上)。

我不希望用户能够单击另一个按钮(开始吧!),这应该将他/她带到下一个视图控制器,即 UITableViewController。此按钮还应在 tableViewController 中创建一个新单元格 - 使用 viewController1 中标签中保存的文本。

我使用了“prepare(for segue:”-function,它可以很好地将数据传递到下一个 viewController,但由于某种原因,我只能将它添加到 tableView-cells 之外的标签。如何将文本添加到 tableView-cells 内的标签?

以及如何让用户同时在tableView中创建一个新单元格?

在 viewController1 中:

@IBOutlet weak var DiaryNameLabel: UILabel!

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    if segue.identifier == "PassingDiaryName" 
        let vc = segue.destination as! DiariesTableView
        vc.name = DiaryNameLabel.text!
    

在viewController2(tableViewController)中:

class DiariesTableView: UITableViewController 

@IBOutlet weak var NameLabel: UILabel!

var name:String = ""

override func viewDidLoad() 
    super.viewDidLoad()

    NameLabel.text = name


override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()


override func numberOfSections(in tableView: UITableView) -> Int 
    return 1


override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return 1


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Diary1", for: indexPath)

    cell.textLabel?.text = NameLabel.text
    return cell

因此,正如我所说,当前的代码可以很好地将文本从 viewController1 中的标签传递到下一个 viewController 中的 UILabel NameLabel 上。但是一旦我在单元格中设置了这个标签,我就会得到错误:

从 DiariesTableView 到 UILabel 的 NameLabel 出口是 无效的。插座不能连接到重复的内容。

先谢谢了!

【问题讨论】:

想想你的第一个单元格是如何创建的。现在考虑如何拥有两个单元格。 (现在不用担心按钮点击了)。现在考虑三个(更改代码以查看这种情况)。所以现在你看到了一个模式,对吗?现在将模式中的逻辑更改为代码并在按钮操作中实现它。 【参考方案1】:

我认为此错误(“从 DiariesTableView 到 UILabel 的 NameLabel 插座无效。插座无法连接到重复内容。”)发生是因为您在动态 tableView 单元格中将 NameLabel 与 UILabel 连接。 您需要继承 UITableViewCell 并在那里绑定名称标签。 像这样的:

final class YourCell: UITableViewCell 
    @IBOutlet var nameLabel: UILabel!

在 cellForRow 函数中:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Diary1", for: indexPath) as! YourCell
    cell.nameLabel.text = NameLabel.text
    return cell

或者,如果您不需要动态表格视图,则可以使用“静态单元格”: enter image description here

使用静态单元格,您可以在 ViewController 中创建出口,而无需实现 UITableViewDataSource,只需在 XCode UI Builder 中添加即可。但是对于静态单元格,您不能在 tableView 中插入或删除单元格

在您的情况下,您需要在某处存储输入用户的字符串数组:

class TextStorage 
    func save(text: String) 
        // save somewhere example NSUserDefaults or CoreData
    

    func obtainText() -> [String] 
        // obtain saved text
    

带有文本字段的 viewContoller 将是这样的。文字:

class ViewController: UIViewController 
    @IBOutlet var textField: UITextField!

    private let textSorage = TextStorage()

    @IBAction func done() 
        textStorage.save(text: textField.text ?? "")
        // then go to viewController with tableView
    

带有表格视图的ViewController只是从存储中获取保存的文本并将其显示在tableView中:

class TableViewController: UIViewController 
    @IBOutlet var tableView: UITableView!

    private let textSorage = TextStorage()
    private var savedText: [String]?

    override func viewWillAppear(_ animated: Bool) 
        super.viewWillAppear(animated)
        updateTableView()
    

    func updateTableView() 
        savedText = textSorage.obtainText()
        tableView.reloadData()
    


extension TableViewController: UITableViewDataSource 
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "Diary1", for: indexPath) as! YourCell
        cell.nameLabel.text = NameLabel.text
        return cell
    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return savedText?.count ?? 0
    

【讨论】:

【参考方案2】:

你搞错了。这很好,因为我想你是新人。

这是你需要做的:

当您按下保存时,您需要将文本保存到某种支架中,例如数组。然后你需要将该数组传递给下一个视图控制器,在那里你可以将它用作表的数据源。如果您的所有连接都正常,它将按照您的预期显示在您的桌子上。

【讨论】:

哈哈,我不怀疑我弄错了——不过我正在尽力而为!只是为了了解那里的小指南;我如何将这个数组从 viewController1 传递给 tableViewController?只是使用segues?还是有其他更好的方法?我在 tableView 中显示什么?正如我所写的,当我尝试将标签添加到我的自定义 tabelViewCell 时,Xcode 往往会给我一个错误。那么我应该以某种方式完成这项工作 - 还是因为有另一种方法可以在 tableViewCell 中显示文本?非常感谢! 对不起,我不应该说“都错了”,但当然事情会变得更好:)。让这个工作。好吧,您将通过与在问题中上面共享的代码中传递字符串相同的方式传递数组。就像您在 tableview 控制器中定义 var name:String = "" 一样,您将定义一个数组。就像您分配 vc.name = DiaryNameLabel.text 一样!在第一个视图控制器中,您现在将分配新构造的数组。 我不相信你需要@IBOutlet weak var NameLabel: UILabel!在日记表视图中。要显示内容只需要 cell.textLabel?.text = array[indexPath.row]。数组显然是您从 viewcontroller one 传递的内容 顺便说一句,这种传递内容的方式称为依赖注入。还有更多可能实现相同的功能,例如委托和通知模式。 哇!我认为您实际上是在使事情正常进行!我现在遇到了另一个问题......我需要显示的文本是几行。在普通标签中,我知道如何在实用工具栏中添加“线条”,但现在文本显示在所谓的“内容视图”或 tableViewCell 中,我不知道如何让它显示几个一个单元格中的线条?

以上是关于允许用户使用来自不同视图控制器中的标签的文本创建新的 tableViewCells?的主要内容,如果未能解决你的问题,请参考以下文章

如何允许标签栏项具有多个视图控制器

标签栏控制器/ Segue问题

如何在 Swift iOS 中创建一个通用的弹出视图控制器

使用来自单独的表视图控制器的选定单元格填充文本字段

显示呈现部分卷曲的视图控制器

如何从 Xcode 中的不同视图控制器禁用工具栏项目 [重复]