Swift3 在UITextView Swift 3中创建编号列表
我试图将用户输入到UITextView的信息制作一个编号列表。比如说,Swift3 在UITextView Swift 3中创建编号列表,swift3,xcode8,Swift3,Xcode8,我试图将用户输入到UITextView的信息制作一个编号列表。比如说, 第一项 清单项目二 清单项目三 这是我尝试过的代码,但没有给我想要的效果。 var currentLine:Int=1 func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool { // Add "1" when the user starts ty
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
// Add "1" when the user starts typing into the text field
if (textView.text.isEmpty && !text.isEmpty) {
textView.text = "\(currentLine). "
currentLine += 1
}
else {
if text.isEmpty {
if textView.text.characters.count >= 4 {
let str = textView.text.substring(from:textView.text.index(textView.text.endIndex, offsetBy: -4))
if str.hasPrefix("\n") {
textView.text = String(textView.text.characters.dropLast(3))
currentLine -= 1
}
}
else if text.isEmpty && textView.text.characters.count == 3 {
textView.text = String(textView.text.characters.dropLast(3))
currentLine = 1
}
}
else {
let str = textView.text.substring(from:textView.text.index(textView.text.endIndex, offsetBy: -1))
if str == "\n" {
textView.text = "\(textView.text!)\(currentLine). "
currentLine += 1
}
}
}
return true
}
正如这里所说的:但是没有成功
非常感谢您的帮助。您可以将UITextView子类化,重写方法willMove(toSuperview),并为UITextViewTextDidChange添加一个观察者,使用选择器将文本拆分为行,并相应地对其进行枚举和编号。请尝试以下操作:
class NumberedTextView: UITextView {
override func willMove(toSuperview newSuperview: UIView?) {
frame = newSuperview?.frame.insetBy(dx: 50, dy: 80) ?? frame
backgroundColor = .lightGray
NotificationCenter.default.addObserver(self, selector: #selector(textViewDidChange), name: .UITextViewTextDidChange, object: nil)
}
func textViewDidChange(notification: Notification) {
var lines: [String] = []
for (index, line) in text.components(separatedBy: .newlines).enumerated() {
if !line.hasPrefix("\(index.advanced(by: 1))") &&
!line.trimmingCharacters(in: .whitespaces).isEmpty {
lines.append("\(index.advanced(by: 1)). " + line)
} else {
lines.append(line)
}
}
text = lines.joined(separator: "\n")
// this prevents two empty lines at the bottom
if text.hasSuffix("\n\n") {
text = String(text.characters.dropLast())
}
}
}
您可以将UITextView子类化,覆盖方法willMove(toSuperview),并为UITextViewTextDidChange添加一个观察者,该观察者使用一个选择器将文本拆分为行,并相应地枚举和编号。请尝试以下操作:
class NumberedTextView: UITextView {
override func willMove(toSuperview newSuperview: UIView?) {
frame = newSuperview?.frame.insetBy(dx: 50, dy: 80) ?? frame
backgroundColor = .lightGray
NotificationCenter.default.addObserver(self, selector: #selector(textViewDidChange), name: .UITextViewTextDidChange, object: nil)
}
func textViewDidChange(notification: Notification) {
var lines: [String] = []
for (index, line) in text.components(separatedBy: .newlines).enumerated() {
if !line.hasPrefix("\(index.advanced(by: 1))") &&
!line.trimmingCharacters(in: .whitespaces).isEmpty {
lines.append("\(index.advanced(by: 1)). " + line)
} else {
lines.append(line)
}
}
text = lines.joined(separator: "\n")
// this prevents two empty lines at the bottom
if text.hasSuffix("\n\n") {
text = String(text.characters.dropLast())
}
}
}
哥们,非常感谢。我甚至没有想到这种方法。你太棒了!我只是尝试在一个新应用程序中实现这一点,以及一个项目列表,但两个都不起作用。请你检查一下。哥们,非常感谢。我甚至没有想到这种方法。你太棒了!我只是尝试在一个新应用程序中实现这一点,以及一个b没有列出清单,但两个都不起作用。你能检查一下吗。