好吧,我已經看到了OBJç以前的問題,並嘗試過。我試圖建立的是一個類似iphone的通訊錄應用程序。我在插入表格中存在這個問題。之前我從來沒有插入行這個問題,我可能認爲這是因爲我的數據結構不好?「NSInternalInconsistencyException」,理由是:「試圖插入一行4到段0,但更新後,只有4節0行」
我嘗試的解決方案是tableView.beginUpdates和endUpdates但還是同樣的錯誤。這是我的聯繫人列表的代碼。
class ContactsListViewController: UITableViewController, AddContactViewControllerDelegate {
let cellID = "contactCellID"
var sectionNames = ["A","B","C","D"]
var name = [0: ["Amber", "Ajay", "Abhishek", "Anshul"], 1: ["Borat", "Bruno", "Billooo"], 2: ["Chinku","Champu","Champak"], 3: ["Daya", "Divya","Delhi Police"]]
//
// @IBOutlet weak var addBarOutlet: UIBarButtonItem!
// @IBAction func addBarButton(sender: UIBarButtonItem) {
// performSegueWithIdentifier("AddItemSegueID", sender: addBarOutlet)
// }
//
//var nameSet = ["0": "Amber", "1": "Blah", "2": "Chris" ]
override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return name.count
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
let array = name[section]
return (array!.count)
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier(cellID, forIndexPath: indexPath)
let nameArray = name[indexPath.section]
// guard let nameArray = name[indexPath.section] else {
// print("Invalid ")
// cell.textLabel?.text = "Not Found"
// return cell
// }
cell.textLabel?.text = nameArray![indexPath.row]
return cell
}
override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
var Keys = [Int] (name.keys)
Keys.sortInPlace()
let value = Keys[section]
var sec = ""
if value == Keys[section] {
sec = sectionNames[section]
}
return sec
}
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.deselectRowAtIndexPath(indexPath, animated: true)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "AddItemSegueID" {
// let navcontroller = segue.destinationViewController as! UINavigationController
// let controller = navcontroller.topViewController as! AddContactViewController
let controller = segue.destinationViewController as! AddContactViewController
controller.delegate = self
}
}
func addContactViewController(controller: AddContactViewController, didFinishAdding item: ContactNames) {
//var dictKeys = [Int](name.keys)
let newName = item.text
let firstIndex = newName.startIndex
//let firstChar = newName[firstIndex]
var check = name[0]!
let newRowIndex = check.count
check.append(newName)
tableView.beginUpdates()
let indexPath = NSIndexPath(forRow: newRowIndex, inSection: 0)
let indexPaths = [indexPath]
tableView.insertRowsAtIndexPaths(indexPaths, withRowAnimation: .Automatic)
tableView.endUpdates()
dismissViewControllerAnimated(true, completion: nil)
}
func addContactViewControllerDidCancel(controller: AddContactViewController) {
dismissViewControllerAnimated(true, completion: nil)
}
}
ContactNames是正常的迅速類coontains一個字符串屬性。 另一件事是我實現的協議在AddItemVC以便將數據發送回透視圖控制器,所以我由代表這也是我最近了解到。 Heres yhe addItemVC:
protocol AddContactViewControllerDelegate: class {
func addContactViewControllerDidCancel(controller: AddContactViewController)
func addContactViewController(controller: AddContactViewController, didFinishAdding item: ContactNames)
}
class AddContactViewController: UIViewController, UITextFieldDelegate {
weak var delegate: AddContactViewControllerDelegate?
@IBOutlet weak var nameField: UITextField!
@IBOutlet weak var doneOutlet: UIBarButtonItem!
var contactList = ContactsListViewController()
override func viewDidLoad() {
nameField.becomeFirstResponder()
self.tabBarController?.tabBar.hidden = true
doneOutlet.enabled = false
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
nameField.resignFirstResponder()
}
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
let oldText: NSString = textField.text!
let newText: NSString = oldText.stringByReplacingCharactersInRange(range, withString: string)
doneOutlet.enabled = (newText.length>0)
// if newText.length > 0 {
// doneOutlet.enabled = true
// }else {
// doneOutlet.enabled = false
// }
return true
}
@IBAction func saveAction(sender: UIBarButtonItem) {
let newItem = ContactNames()
newItem.text = nameField.text!
delegate?.addContactViewController(self, didFinishAdding: newItem)
}
@IBAction func cancelAction(sender: UIBarButtonItem) {
delegate?.addContactViewControllerDidCancel(self)
}
}
此外,如果你建議一個更好的數據結構。
解決方案我:「?controller.navigationController .popViewControllerAnimated(真)」與發現dismissviewcontroller – amber