【问题标题】:How to change segmented control title from another UIViewController (Settings)如何从另一个 UIViewController 更改分段控件标题(设置)
【发布时间】: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 团结起来!感谢您的回答...我正在尝试通过代表来解决,但它似乎不起作用,所以我会尝试您的解决方案。

标签: ios swift


【解决方案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的参数是(文本:字符串)?但是它似乎不起作用...单击“保存设置”后屏幕返回原始屏幕,但按钮标题没有改变
猜你喜欢
  • 1970-01-01
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多