如何从另一个 UIViewController 更改分段控件标题(设置)

Posted

技术标签:

【中文标题】如何从另一个 UIViewController 更改分段控件标题(设置)【英文标题】:How to change segmented control title from another UIViewController (Settings) 【发布时间】:2016-11-27 19:07:47 【问题描述】:

编辑 Current Code

所以我刚刚开始 ios 开发,所以我决定制作一个小费计算器来学习 Swift 的基础知识和基础。我有 70% 的感觉,但是我无法从另一个 UIViewController 引用数据...

所以我有一个加载屏幕,在我单击按钮后它会转到提示计算器......然后我有一个可以更改分段控制部分标题的设置。因此,如果我想将默认设置更改为 (10%, 15%, 30%),我可以在“设置”中执行此操作。但是我似乎无法弄清楚如何获取 TextField.text 并将其作为分段控件标题的标题。

我有一个属于设置页面的 ViewController3 类,但它是完全空白的。

【问题讨论】:

您是否正在尝试将数据传递给下一个 viewController? 我正在尝试从“设置”中的 textFields 中获取数据以更改上一个 viewController 中分段控件的标题 如果你想previous传递数据,你应该使用delegation。你可能想检查this answer。 @JayPark,你是 Hokie 吗?我也是! @vacawama Hokies 团结起来!感谢您的回答...我正在尝试通过代表来解决,但它似乎不起作用,所以我会尝试您的解决方案。 【参考方案1】:

要将设置传递回您的第一个 viewController,您可以使用从第一个 viewController 传递的闭包。

以下是如何执行此操作的示例。在prepare(for:) 中设置闭包processTipSettings 指向一个处理函数。在这种情况下,changeSegmentLabels 将采用提示设置并使其成为分段控件的标签。

当用户点击保存时,按钮的@IBAction 将使用 textFieldLabels 中的值调用 processTipSettingschangeSegmentLabels 将更新分段控件中的标题。


ViewController.swift:

import UIKit

class ViewController: UIViewController 

    @IBOutlet var tipsSegmentedController: UISegmentedControl!

    func changeSegmentLabels(labels: [String?]) 
        if labels.count == 3 
            for i in 0..<3 
                tipsSegmentedController.setTitle(labels[i], forSegmentAt: i)
            
        
    

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        if segue.identifier == "settings" 
            if let dvc = segue.destination as? SettingsViewController 
                dvc.processTipSettings = changeSegmentLabels
            
        
    



SettingsViewController.swift

class SettingsViewController: UIViewController 

    @IBOutlet weak var tip1: UITextField!
    @IBOutlet weak var tip2: UITextField!
    @IBOutlet weak var tip3: UITextField!

    // Call this closure when Save is pressed.
    var processTipSettings: (([String?]) -> ())?

    @IBAction func saveSettings(_ sender: UIButton) 
        processTipSettings?([tip1.text, tip2.text, tip3.text])

        _ = self.navigationController?.popViewController(animated: true)
    


【讨论】:

什么是 segue.indentifier?我假设它的标题在屏幕顶部对吗? 如果你只有一个 segue,你可以跳过它。如果您有来自同一个视图控制器的多个 segue,则 segue 标识符允许您确定您正在查看哪一个。通过单击 segue 箭头,然后在属性检查器中设置标识符字符串,您可以在 Storyboard 中设置标识符。 好的,非常感谢,您介意将我添加到可以快速聊天的地方吗?因为我有几个快速的问题..非常感谢 在此处提问,SO 会尽快将其转移到聊天中。 所以我这样做了,所以 processTips 只使用单个文本字符串而不是数组字符串。所以我只是在两个初始化中都去掉了“[]”,所以它基本上看起来像 var processTipSettings: ((String?) -> ())?而changeLabels的参数是(文本:字符串)?但是它似乎不起作用...单击“保存设置”后屏幕返回原始屏幕,但按钮标题没有改变

以上是关于如何从另一个 UIViewController 更改分段控件标题(设置)的主要内容,如果未能解决你的问题,请参考以下文章

如何从另一个 UIViewController 重新加载 UITableViewController

如何从另一个 UIViewController 更改分段控件标题(设置)

如何从另一个/第二个 UIViewController 隐藏 UILabel?

从另一个 UIViewController 中呈现一个 UIViewController?

从另一个 UIViewController 呈现 UIViewController

有没有办法查看当前 UIViewController 是不是从另一个 UIViewController 的解雇中出现