将文本保存在数组中并显示在表格视图中

时间:2016-01-18 17:41:37

标签: arrays swift uitextfield

我正在尝试创建一个基于字符串数组显示表视图的应用程序。

我有一个视图控制器和一个较小的内容视图。在视图控制器中有一个文本字段和一个按钮,它应该将写入的文本保存在一个数组中并将其显示在表视图控制器中。以及将其嵌入内容视图中。

我不知道如何保存书面文字并将其添加到数组中,也许使用追加。

如何在表格视图中显示数组并将数组保存在NSUserDefaults中?

编辑: 这是视图控制器和内容视图的图像。我想在文本字段中插入一个字符串(绿色按钮上的一个保存),然后点击绿色按钮,我写的字符串被添加到数组中并显示在表视图控制器的表格视图单元中嵌入内容视图。同时,文本字段返回空,但我已经知道如何清除它。然后,我可以在文本字段中重写文本,它应该重复我刚才描述的操作。 在NSUserDefaults中保存这一时刻并非如此重要。 谢谢您的帮助。 :)

http://i.stack.imgur.com/z5uTc.png

编辑2:

MainVC

import UIKit

class mainVC: UIViewController {
@IBOutlet var txtField: UITextField!
var embTableVC: tableVC!

override func viewDidLoad() {
    super.viewDidLoad()
 // Do any additional setup after loading the view.
}

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

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "embededTableVC" {
        embTableVC = segue.destinationViewController as! tableVC
    }
}

@IBAction func Save() {
    if let Text = txtField.text {
        if txtField.text == "" {
            myArray.append(Text)
            let row = myArray.count-1
            let indexPath = NSIndexPath(forRow: row, inSection: 0)
            embTableVC.myTableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
        }
    }
 txtField.text = ""
    txtField.resignFirstResponder()
}     
}

TableVC

  import UIKit

  var myArray = [String]()

  class tableVC: UITableViewController {
  @IBOutlet var myTableView: UITableView! {
    didSet {
        myTableView.dataSource = self
        myTableView.delegate = self
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    myTableView.dataSource = self
    myTableView.delegate = self
    myTableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "customcell")
    // Do any additional setup after loading the view, typically from a nib.

}

override func viewDidAppear(animated: Bool) {
    super.viewDidAppear(animated)
    myTableView.reloadData()
}

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

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return myArray.count
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = myTableView.dequeueReusableCellWithIdentifier("customcell", forIndexPath: indexPath) as UITableViewCell

    cell.textLabel?.text = myArray[indexPath.item]

    return cell
}

非常感谢:)

3 个答案:

答案 0 :(得分:0)

存储信息:

// Get the standardUserDefaults object, store your UITableView data array against a key, synchronize the defaults
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:arrayOfImage forKey:@"tableViewDataImage"];
[userDefaults setObject:arrayOfText forKey:@"tableViewDataText"];
[userDefaults synchronize];

要检索信息:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSArray *arrayOfImages = [userDefaults objectForKey:@"tableViewDataImage"];
NSArray *arrayOfText = [userDefaults objectForKey:@"tableViewDataText"];
// Use 'yourArray' to repopulate your UITableView
On first load, check whether the result that comes back from NSUserDefaults is nil, if it is, you need to create your data, otherwise load the data from NSUserDefaults and your UITableView will maintain state.

在Swift中,可以使用以下方法:

let userDefaults = NSUserDefaults.standardUserDefaults()
userDefaults.setObject(arrayOfImage, forKey:"tableViewDataImage")
userDefaults.setObject(setObject:arrayOfText, forKey:"tableViewDataText")
userDefaults.synchronize()

var arrayOfImages = userDefaults.objectForKey("tableViewDataImage")
var arrayOfText = userDefaults.objectForKey("tableViewDataText")

希望这会有所帮助。您还可以使用xcdatamodeld来保存和检索数据。

答案 1 :(得分:0)

这是一个简单的解决方案,用于将文本存储在数组中,如果您可能拥有大量字符串,则该选项比NSUserDefaults更好。

首先,您需要在管理表视图的View Controller中有一个字符串数组。然后,您将需要一种方法来访问该数组并进行编辑。

我会在第一个视图控制器(带容器)中存储对表视图控制器的引用。要首先设置此引用,请使用embed segue。

在您的故事板中,将第一个VC连接到表VC的箭头实际上是一个嵌入的segue,它在加载容器视图时触发。单击segue,在Xcode的属性检查器中将标识符更改为某些字符串,例如“embedTableVC”。

然后我们可以在第一个视图控制器中设置引用。这里是一些相关的代码,假设带有容器的视图控制器有一个MainViewController类,容器中的表视图控制器有一个TableViewController类:

class MainViewController: UIViewController {

    var embededTableVC: TableViewController!

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "embedTableVC" {
            embededTableVC = segue.destinationViewController as! TableViewController
        }
    }

}

主视图控制器加载后,将加载容器,这将导致segue运行,这将导致调用prepareForSegue。在此实现中,我们将表视图控制器存储在主视图控制器的属性中,以便我们可以访问它。由于类是引用类型,因此该属性将引用相同的对象,而不是副本。

然后,按下保存按钮后,您将从文本字段中获取文本,并将其设置为表VC中的数组,如下所示:

@IBAction func save() {
    if let text = textField.text {
        if text != "" {
            embededTableVC.valueArray.append(text)
            // and if you want to go ahead and add it to the array from here instead of using delegation or notification observance
            let row = embededTableVC.valueArray.count - 1
            let indexPath = NSIndexPath(forRow: row, inSection: 0)
            tableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
        }
    }
}

if-let语法确保文本字段的text属性不是nil。

我相信这正是您所寻找的,但请记住,一旦应用重新启动,一切都将消失,因为我们没有使用NSUserDefaults或Core Data将任何内容存储到设备的驱动器中。如果你需要持久性,你需要两种方法的组合。

修改 至于使用数组中的内容填充表格视图,您应该参考Apple's Docs,因为这里的解释会非常冗长,并且可以轻松找到信息。或者,您可以查看this article以了解填充表格视图,或查看this question。您需要至少为表格视图实施numberOfSectionsInTableViewnumberOfRowsInSectioncellForRowAtIndexPath

编辑2: 在阅读完代码之后,我会说有很多事情可能最终应该改变,但为了让它现在正常工作,现在需要做出以下改变:

更改此内容(来自Save())...

if let Text = txtField.text {
    if txtField.text == "" {
        myArray.append(Text)
        let row = myArray.count-1
        let indexPath = NSIndexPath(forRow: row, inSection: 0)
        embTableVC.myTableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
    }
}

...到此

if let text = txtField?.text {
    if text != "" { // Notice the two changes on this line
        myArray.append(text)
        let row = myArray.count - 1
        let indexPath = NSIndexPath(forRow: row, inSection: 0)
        embTableVC.myTableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
    }
}

更改此项(在cellForRowAtIndexPath中)...

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = myTableView.dequeueReusableCellWithIdentifier("customcell", forIndexPath: indexPath) as UITableViewCell

    cell.textLabel?.text = myArray[indexPath.item]

    return cell
}

...到此

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = myTableView.dequeueReusableCellWithIdentifier("customcell", forIndexPath: indexPath) as UITableViewCell

    cell.textLabel?.text = myArray[indexPath.row] // Notice `row`, not item`

    return cell
}

如果你因为打开nil可选项而仍然崩溃,这很有可能,我需要知道Xcode崩溃的行,我需要知道错误说的是什么。

答案 2 :(得分:0)

import UIKit

class SecondViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {      

**var message = ["a","b"]
var toPass: String!**

@IBOutlet weak var tableView: UITableView!
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
        // Do any additional setup after loading the view.

        **message.append(toPass)**           
    }    

@IBAction func SendButon(_ sender: UIButton) {
    performSegue(withIdentifier: "segue2", sender: nil)
}      

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

   // tableView.reloadData()
    return message.count
}    

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {    

        tableView.register(UINib(nibName: "TableViewCell", bundle: nil),
                       forCellReuseIdentifier: "CellFor")

        let cell = tableView.dequeueReusableCell(withIdentifier: "CellFor", for: indexPath) as! TableViewCell

        cell.labelView.text = message[indexPath.row]

        return cell       
    }           
}