【问题标题】:Storing UITextView String / Text Data存储 UITextView 字符串/文本数据
【发布时间】:2016-11-26 12:20:28
【问题描述】:

所以我正在尝试创建一个显示可编辑的大文本视图的视图。在情节提要中,它被编辑为显示文本“在此处记笔记(向下滑动以关闭键盘):”作为占位符。

我想让它记住用户何时编辑除此之外的文本......所以我使用 != 做了一个 if 语句,该比较器适用于快速比较字符串。我不确定它是否会得到应用商店审核的批准,因为他们推荐 isEqualToString()。

无论如何,下面的代码都是针对该视图的...如果用户从占位符更改了输入的文本,则它不会记住输入的文本。它识别出它已被更改,但是当您返回视图时,它再次显示默认占位符...帮助?

import Foundation
import UIKit

class MessageNotesViewController: UIViewController, UITextViewDelegate {

@IBOutlet weak var messageNotes: UITextView!
@IBOutlet var swiped: UISwipeGestureRecognizer!

var placeholder = "Take your notes here (Swipe Down to dismiss the keyboard): "

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

    messageNotes.delegate = self
    messageNotes.text = placeholder

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

@IBAction func openIn(_ sender: AnyObject) {

    print("Share with Social Media or Copy to Notes")
    //let textToShare = messageNotes.attributedText

       // let objectsToShare = [textToShare]
        //let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil)


    //activityVC.popoverPresentationController?.sourceView = (sender as! UIView)
    //self.present(activityVC, animated: true, completion: nil)


    if let notes = messageNotes.text {
        let avc = UIActivityViewController.init(activityItems: [notes], applicationActivities: nil)

        avc.popoverPresentationController?.barButtonItem = sender as? UIBarButtonItem
        self.present(avc, animated: true) {
            print("completed")
        }
    }
}

func touchesBegan(_ messageNotes: UITextField) -> Bool {
    self.view.endEditing(true)
    return false
}


//let defaults = NSUserDefaults.

override func viewWillDisappear(_ animated: Bool) {
    //PrepareForSegue didn't quite work
    print("View Will Disappear")

    //Testing if the user has entered any text if so preserve entered text
    if messageNotes.text != placeholder {

        //viewDidLoad(typedText)
        print("the user altered the text in some way. \n")

        placeholder = messageNotes.text
        // assigns new placeholder
    }
    else{
        // do something else - if needed
    }
}
}

//Sub class decleration for ActivityForNotesViewController as called in openIn
class ActivityForNotesViewController: UIActivityViewController {

internal func _shouldExcludeActivityType(_ activity: UIActivity) -> Bool {
    let activityTypesToExclude = [
    ]

    if let actType = activity.activityType() {
        if activityTypesToExclude.contains(actType) {
            return true
        }
        else if super.excludedActivityTypes != nil {
            return super.excludedActivityTypes!.contains(actType)
        }
    }
    return false
}
}

尝试实现以下答案时出现一些编译错误。

在 viewWillAppear 函数中,编译器显示“无法调用非函数类型 'UserDefaults' 的值” - 编译器突出显示行 if let newText 行,UserDefaults.standardUserDefaults() 用红色下划线。

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

    messageNotes.delegate = self
    messageNotes.text = placeholder

    if let newText = UserDefaults.standardUserDefaults().objectForKey("textKey"){
        if newText.length > 0 {
            messageNotes.text = newText
        }
    }

}

在viewWillDisappear函数中发现同样的编译错误:

override func viewWillDisappear(_ animated: Bool) {
    //Prepare for segue didn't quite work for what I need
    print("View Will Disappear")

    //Testing if the user has entered any text if so preserve entered text
    if messageNotes.text != placeholder {

        //viewDidLoad(typedText)
        print("the user altered the text in some way. \n")

        UserDefaults.standardUserDefaults().setObject(messageNotes.text!, forKey:"textKey")

        // assigns new placeholder
    }
    else{
        // do something else - if needed
    }
}
}

【问题讨论】:

  • 我下面的回答应该对你有用。此外,您无需担心使用!= 而不是isEqualToString(),只要它有效。在审查时,Apple 无法真正看到您的特定代码。
  • @WMios 已编辑以反映函数/编译器错误
  • 查看我修改后的代码。我在不知不觉中使用了 Swift 2 语法 - 检查了我链接到的文档
  • @WMios 我想我可能已经修复了错误...我使用UserDefaults.standard.object(forKey: "textKey") 而不是UserDefaults.standardUserDefaults().object("textKey")... 它还说在if语句中messageNotes.text = newText行需要是替换了,所以我做了messageNotes.text = newText as! String... 并且所有编译器错误都消失了。
  • 是的,这与我 14 分钟前所做的更改几乎相同。我没有将演员表添加到字符串中。

标签: ios swift swift3 userdefaults


【解决方案1】:

您需要将更改保存在某处,我建议使用 UserDefaults,这是保存用户偏好和其他小块数据的好方法。

我会在 viewWillDisappear 中替换它:

placeholder = messageNotes.text

UserDefaults.standardUserDefaults().set(messageNotes.text!, forKey:"textKey")

viewWillAppear 我要补充:

messageNotes.text = placeholder
if let newText = UserDefaults.standardUserDefaults().object("textKey"){
    if newText.length > 0 {
        messageNotes.text = newText as! String
    }
}

【讨论】:

  • 是否有任何导入或我需要做的任何事情,因为它给出了编译器错误:无法调用非函数类型'UserDefaults'的值?我会尝试查看您发布的文档页面以查看它。
  • 在哪一行?你确定你使用的是 Swift 3 吗?如果不是,您可以在UserDefaults 之前添加NS 以使其成为NSUserDefaults
  • 另请注意,ObjectForKey 应该是 objectForKey
  • 当我添加你建议的代码时,它给了我这个错误。也许我做错了什么。它特别抱怨 UserDefaults.standardUserDefaults() 的两个实例
  • UserDefaults 应该在 Swift 3 中工作......奇怪的是它认识到将 NSUserDefaults 切换为 UserDefaults 但随后不会构建。听起来像一个错误。
猜你喜欢
  • 1970-01-01
  • 2017-03-01
  • 2017-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多