这里是初学者,我创建了一个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));
答案 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
,然后引用tag
和selectedIndex
来确定更改哪个字段或值。然后,您可以轻松地将值存储在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
}
}