与isHidden = true / false相比,是否有更好的方法显示和隐藏链接到分段控件的多个textview?

时间:2018-09-04 05:24:38

标签: ios swift

这里是初学者,我创建了一个VC,其中包含3个分段控件,每个控件有3个分段。每个段选择均显示不同的文本视图。在任何给定时间,都会显示2个分段控件,因此您可以选择在6个文本视图中的任何一个之间切换。总共有9个textview。

在模拟器中,我的编写方法现在似乎有些毛病,因此我想知道一种更好的编写此类重复代码的方法。在随时显示的2/3分段控件的所有选择之间,有很多行.isHidden = false和isHidden = true。谁能告诉我如何以更安全的方式写东西?如果您只是想举一个简短的例子或告诉我如何使用Google,我将不胜感激。

这就是我所拥有的:

import { enableProdMode } from "@angular/core";
import { platformBrowserDynamic } from "@angular/platform-browser-dynamic";

import { AppModule } from "./app/app.module";
import { environment } from "./environments/environment";

if (environment.production) {
    enableProdMode();
}

platformBrowserDynamic().bootstrapModule(AppModule)
    .catch(err => console.log(err));

4 个答案:

答案 0 :(得分:0)

您可以在切换之前将它们全部设置为默认值,然后在这种情况下仅更新不同的值。在您的第三个方法中,这对于大多数视图的默认状态为true尤其有效。

pjsip

答案 1 :(得分:0)

首先,您需要提取开关情况中常见的行为,以便删除一些重复的行为。

Private Sub Worksheet_Calculate()

Static OldVal() As Variant
Dim cll As Range

ReDim OldVal(1 To Range("N1:N999").Cells.Count)

i = 1
For Each cll In Range("N1:N999")
    If cll.Value <> OldVal(i) Then
        OldVal(i) = cll.Value
        i = i + 1
        'This part compares your new value to F column value
        'Change cll.value statement to oldval(i) to compare oldvalue and F column value
        If cll.Value = Cells(cll.Row, "F").Value Then
            'Your Code
        End If
    End If
Next cll

End Sub

答案 2 :(得分:0)

如果文本视图的位置相同,则可以重复使用。如果它们意图不同,则可以使用插座集合将它们分组。所以你会有

@IBOutlet weak var langTextViews: [UITextView]!

代替:

@IBOutlet weak var firstLangText: UITextView!
@IBOutlet weak var secondLangText: UITextView!
@IBOutlet weak var thirdLangText: UITextView!

这将使您的代码更具组织性和可读性。您可以优化textView隐藏/显示部分。例如,textOrTranslationChange方法将如下所示:

@IBAction func textOrTranslationChange(_ sender: UISegmentedControl) {
  textSegmentedControl.isHidden = (segmentedControl.selectedSegmentIndex != 0)
  langTextViews[0].isHidden = (segmentedControl.selectedSegmentIndex != 0)
  translationSegmentedControl.isHidden = (segmentedControl.selectedSegmentIndex != 1)
  textInfo.isHidden = (segmentedControl.selectedSegmentIndex != 2)
  etc...
}

答案 3 :(得分:0)

一个优雅的解决方案是使用UISegmentedControl的美。 Swift字典和tag属性。

您可以利用单个UITextView ,方法是设置分段控件的初始tag,然后引用tagselectedIndex来确定更改哪个字段或值。然后,您可以轻松地将值存储在Dictionary中,而无需复杂的switch语句。

这是一个最小的,可重复的示例。输入诸如验证之类的代码后,您应该实现自己的值处理方法。

import Foundation
import UIKit

class ViewController: UIViewController, UITextFieldDelegate {
    // Properties

    var activeSegment: UISegmentedControl?
    var activeIndex: Int?

    var values:[String: String] = [:]


    lazy var segmentedController: UISegmentedControl = {
        let seg = UISegmentedControl(items: ["Name", "Age", "Language"])
        seg.translatesAutoresizingMaskIntoConstraints = false
        seg.tag = 0
        seg.addTarget(self, action: #selector(segmentedControllerValueChanged(sender:)), for: .valueChanged)
        return seg
    }()

    lazy var secondSegmentedController: UISegmentedControl = {
        let seg = UISegmentedControl(items: ["Type", "Kind", "Thing"])
        seg.translatesAutoresizingMaskIntoConstraints = false
        seg.tag = 1
        seg.addTarget(self, action: #selector(segmentedControllerValueChanged(sender:)), for: .valueChanged)
        return seg
    }()

    let textField: UITextField = {
        let tf = UITextField(frame: CGRect.zero)
        tf.translatesAutoresizingMaskIntoConstraints = false
        tf.placeholder = "Select Field"
        return tf
    }()


    override func viewDidLoad() {
        super.viewDidLoad()
        textField.delegate = self
        self.layoutSubviews()

    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
    }

    func layoutSubviews() {
        let guide = self.view.safeAreaLayoutGuide
        let spacing:CGFloat = 12.0

        self.view.addSubview(segmentedController)
        self.view.addSubview(secondSegmentedController)
        self.view.addSubview(textField)

        segmentedController.widthAnchor.constraint(equalTo: guide.widthAnchor).isActive = true
        segmentedController.heightAnchor.constraint(equalToConstant: 55.0).isActive = true
        segmentedController.bottomAnchor.constraint(equalTo: guide.bottomAnchor, constant: -spacing).isActive = true
        segmentedController.centerXAnchor.constraint(equalTo: guide.centerXAnchor).isActive = true

        secondSegmentedController.widthAnchor.constraint(equalTo: guide.widthAnchor).isActive = true
        secondSegmentedController.heightAnchor.constraint(equalToConstant: 55.0).isActive = true
        secondSegmentedController.bottomAnchor.constraint(equalTo: segmentedController.topAnchor, constant: -spacing).isActive = true
        secondSegmentedController.centerXAnchor.constraint(equalTo: guide.centerXAnchor).isActive = true

        textField.centerXAnchor.constraint(equalTo: guide.centerXAnchor).isActive = true
        textField.centerYAnchor.constraint(equalTo: guide.centerYAnchor).isActive = true
        textField.heightAnchor.constraint(equalToConstant: 55.0).isActive = true
        textField.widthAnchor.constraint(equalTo: guide.widthAnchor, constant: -spacing*2).isActive = true

    }

    @objc func segmentedControllerValueChanged(sender: UISegmentedControl) {
        // Clear all other segments
        let segmentedcontrols = [segmentedController, secondSegmentedController]
        segmentedcontrols.forEach { (control) in
            if (control.tag != sender.tag) {
                control.selectedSegmentIndex = -1
            }
        }
        // Safely get the title for the index
        guard  let titleForIndex = sender.titleForSegment(at: sender.selectedSegmentIndex) else {
            self.textField.placeholder = "Select Field"
            return
        }

        // Set the active fields.
        self.textField.text = nil
        self.textField.placeholder = "Input " + titleForIndex
        self.activeSegment = sender
        self.activeIndex = sender.selectedSegmentIndex

        // Handle Text Input with your own methods / switch statements


        print("Value did change to: \( sender.selectedSegmentIndex) with tag \(sender.tag)" )
        print("values: \(values)")

    }

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


    //MARK: - Text Field Delegate

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        // Safely get the title for the index

        guard let segment = activeSegment, let index = activeIndex, let activeSegmentTitle = segment.titleForSegment(at: index) else {
            return false
        }

        guard let text = textField.text else {
            return false
        }

        values[activeSegmentTitle] = text

        textField.resignFirstResponder()
        return true
    }
}

View and Output Diagram