2016-01-28 2 views
0

Я создаю приложение, которое, написав строку в текстовом поле, сохраняет ее в массиве. Массив показан в таблицеViewController, встроенном в mainViewController. Ситуация такова. http://i.stack.imgur.com/z5uTc.png. Я хочу, чтобы каждый раз, когда я нажимаю зеленую кнопку «Сохранить», строка, которую я написал в текстовом поле, сохраняется и отображается в таблицеView, а textField возвращает пустой, поэтому я могу переписать строку, которая добавляется в массив , TableView, в этом случае, показывает две строки, которые я написал в том же текстовом поле. Я попытался написать код для двух viewControllers (mainViewVC и tableVC).Сохранить строку текстового поля в массиве - Swift

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 
} 

Код я написал не работает. Я могу скомпилировать и запустить приложение на своем устройстве, но когда я нажимаю зеленую кнопку «Сохранить», приложение падает. Сообщение об ошибке является «фатальной ошибкой: неожиданно обнаружено нуль при разворачивании необязательного значения» в строке: embTableVC.myTableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Fade) в «Сохранить» IBAction. Вы можете мне помочь? Спасибо большое :)

ответ

3

Вы пытаетесь добавить строки в представление таблицы, когда оно еще не инициализировано. Что вы можете сделать, сохраните строки в массиве и передайте этот массив в TableVC из метода prepareForSegue в MainVC. Затем используйте этот массив, чтобы заполнить представление таблицы из метода cellForRowAtIndexPath: TableVC.

В методе сохранения MainVC вам нужно только добавить массив, то есть вам нужен только этот код.

@IBAction func Save() { 
if let Text = txtField.text { 
    if txtField.text == "" { 
     myArray.append(Text) 
    } 
} 

Я предполагаю, что ваша myArray переменная является свойством в TableVC. Затем в вашем методе prepareForSegue сделайте это.

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

В вашем cellForRowAtIndexPath методе TableVC, в измените строку вы установили текст метки для этого.

cell.textLabel?.text = myArray[indexPath.row] 
+0

Итак, что случилось в моем коде? Что мне делать? Я отредактировал код tableVC –

+0

Создайте массив как свойство в TableVC и передайте массив, сделанный в MainVC, в метод prepareForSegue MainVC. – Skywalker

+0

С функцией «Сохранить» у меня нет проблем с кодом. С prepareForSegue я не могу написать 'embTableVC.myArray = myArray', потому что он говорит:« Нет члена myArray в embTableVC ». –

Смежные вопросы