Uitableview 写入事务中的域-首先在RLMRealm实例上调用beginWriteTransaction

Uitableview 写入事务中的域-首先在RLMRealm实例上调用beginWriteTransaction,uitableview,swift3,realm,ios10,Uitableview,Swift3,Realm,Ios10,由于未捕获的异常,我的应用程序正在终止: “RLMEException”,reason:“只能在写事务中添加、删除或创建域中的对象-首先在RLMRealm实例上调用beginWriteTransaction。” 我是使用Swift 3的新手,Swift 3的结构也发生了变化 下面是我的代码: #import RealmSwift override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: In

由于未捕获的异常,我的应用程序正在终止:

“RLMEException”,reason:“只能在写事务中添加、删除或创建域中的对象-首先在RLMRealm实例上调用beginWriteTransaction。”

我是使用Swift 3的新手,Swift 3的结构也发生了变化

下面是我的代码:

   #import RealmSwift  

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    var todoItem: ToDoItem?

    switch indexPath.section {
    case 0:
        todoItem = todos.object(at: UInt(indexPath.row)) as? ToDoItem
    case 1:
        todoItem = finished.object(at: UInt(indexPath.row)) as? ToDoItem
    default:
        fatalError("What the fuck did you think ??")
    }


     let realm = try! Realm() // 1
     try! realm.write { () -> Void in
        todoItem?.finished = !todoItem!.finished
    }

    tableView.reloadData()
}

   func didFinishTypingText(_ typedText: String?) {
    if (typedText?.utf16.count)! > 0 {
        let newTodoItem = ToDoItem()
        newTodoItem.name = typedText!
        let realm = try! Realm() // 1

        try! realm.write { () -> Void in//
        {
          realm.add(newTodoItem  as! Object)
        }
        tableView.reloadData()
    }  

   class ToDoItem : RLMObject
   {
    /*Every property that should be fetched and stored 
     in the database also needs the dynamic keyword. 
    Also, set the default values for the properties.*/

    dynamic var name = ""
    dynamic var finished = false

    convenience init(name: String) {
        self.init()
        self.name = name
     }
  }   

    var todos: RLMResults<Object> {
         get {
             let predicate = NSPredicate(format: "finished == false",              argumentArray: nil)
            return ToDoItem.objects(with: predicate)
       }
    }

var finished: RLMResults<Object> {
    get {
        let predicate = NSPredicate(format: "finished == true", argumentArray: nil)
        return ToDoItem.objects(with: predicate)
    }
  }
#导入RealmSwift
重写func tableView(tableView:UITableView,didSelectRowAt indexPath:indexPath){
var todoItem:todoItem?
开关indexPath.section{
案例0:
todoItem=todos.object(位于:UInt(indexPath.row))作为?todoItem
案例1:
todoItem=finished.object(位于:UInt(indexPath.row))作为?todoItem
违约:
法塔莱罗(“你他妈的怎么想的??)
}
让realm=try!realm()//1
试试!realm.write{()->Void in
todoItem?.finished=!todoItem!。finished
}
tableView.reloadData()
}
func didFinishTypingText(uuTypedText:String?){
如果(键入文本?.utf16.count)!>0{
设newTodoItem=ToDoItem()
newTodoItem.name=typedText!
让realm=try!realm()//1
试试!realm.write{()->Void in//
{
realm.add(newTodoItem作为!对象)
}
tableView.reloadData()
}  
类ToDoItem:RLMObject
{
/*应该提取和存储的每个属性
在数据库中还需要动态关键字。
另外,设置属性的默认值*/
动态变量名称=“”
动态var finished=false
便利初始化(名称:字符串){
self.init()
self.name=名称
}
}   
var todos:RLMResults{
得到{
let predicate=NSPredicate(格式:“finished==false”,argumentArray:nil)
返回到doItem.objects(带:谓词)
}
}
var完成:RLMResults{
得到{
let predicate=NSPredicate(格式:“finished==true”,argumentArray:nil)
返回到doItem.objects(带:谓词)
}
}
/-----------第二视图控制器--------/

导入UIKit
导入RealmSwift
类ReamTableViewController:UITableViewController,AddViewControllerDelegate{
var todos:结果{
得到{
let predicate=NSPredicate(格式:“finished==false”,argumentArray:nil)
返回到doItem.objects(带:谓词)
}
}
var已完成:结果{
得到{
let predicate=NSPredicate(格式:“finished==true”,argumentArray:nil)
返回到doItem.objects(带:谓词)
}
}
重写func viewDidLoad(){
super.viewDidLoad()
tableView.register(UITableViewCell.self,强制重用标识符:“CellIdentifier”)
setupNavigationBar()
}
func setupNavigationBar(){
navigationItem.rightBarButtonItem=UIBarButtonItem(barButtonSystemItem:.add,target:self,action:#选择器(RealmTableViewController.addButtonAction))
}
函数addButtonAction(){
让addViewController=addViewController(nibName:nil,bundle:nil)
addViewController.delegate=self
让navController=UINavigationController(rootViewController:addViewController)
存在(导航控制器,动画:真,完成:无)
}
重写func numberOfSections(在tableView:UITableView中)->Int{
返回2
}
重写func tableView(tableView:UITableView,numberofrowsinssection:Int)->Int{
开关段{
案例0:
返回整数(todos.count)
案例1:
返回Int(finished.count)
违约:
返回0
}
}
重写func tableView(tableView:UITableView,titleForHeaderInSection:Int)->String{
开关段{
案例0:
返回“待办事项”
案例1:
返回“已完成”
违约:
返回“”
}
}
重写func tableView(tableView:UITableView,cellForRowAt indexath:indexPath)->UITableViewCell{
将cell=tableView.dequeueReusableCell(标识符为:“CellIdentifier”,for:indexPath)作为UITableViewCell
让index=UInt(indexath.row)
开关indexPath.section{
案例0:
如果让todoItem=todos.object(at:index)作为?todoItem{
让AttributeText=NSMutableAttributeString(字符串:todoItem.name)
AttributeText.addAttribute(NSStrikethrowStyleAttributeName,值:0,范围:NSMakeRange(0,AttributeText.length))
cell.textLabel?.attributedText=attributedText
}
案例1:
如果让todoItem=finished.object(at:index)作为?todoItem{
让AttributeText=NSMutableAttributeString(字符串:todoItem.name)
AttributeText.addAttribute(NSStrikethrowStyleAttributeName,值:1,范围:NSMakeRange(0,AttributeText.length))
cell.textLabel?.attributedText=attributedText
}
违约:
法塔莱罗(“你怎么想的?”)
}
返回单元
}
重写func tableView(tableView:UITableView,didSelectRowAt indexPath:indexPath){
var todoItem:todoItem?
开关indexPath.section{
案例0:
todoItem=todos.object(位于:UInt(indexPath.row))作为?todoItem
案例1:
todoItem=finished.object(位于:UInt(indexPath.row))作为?todoItem
违约:
法塔莱罗(“你怎么想的?”)
}
//让realm=RLMRealm.default()
//试试!realm.transactionWithBlock(){
//试试!realm.beginWriteTransaction()
让realm=try!realm()//1
试试!realm.write{()->Void in
todoItem?.finished=!todoItem!。finished
}
//}
tableView.reloadData()
}
func didFinishTypingText(uuTypedText:String?){
如果(键入文本?.utf16.count)!>0{
设newTodoItem=ToDoItem()
newTodoItem.name=typedText!
//让realm=RLMRealm.default()
让realm=try!realm()//1
试试!realm.write{()->Void in//
//试试!realm.transactionWithBlock(){
//realm.add(newTodoItem)
realm.add(newTodoItem)
//}
    import UIKit
    import RealmSwift
    class RealmTableViewController: UITableViewController,AddViewControllerDelegate {

var todos: Results<Object> {
    get {
        let predicate = NSPredicate(format: "finished == false", argumentArray: nil)
        return ToDoItem.objects(with: predicate)
    }
}

var finished: Results<Object> {
    get {
        let predicate = NSPredicate(format: "finished == true", argumentArray: nil)
        return ToDoItem.objects(with: predicate)
    }
}

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.register(UITableViewCell.self, forCellReuseIdentifier: "CellIdentifier")
    setupNavigationBar()
}

func setupNavigationBar() {
    navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(RealmTableViewController.addButtonAction))
}

func addButtonAction() {
    let addViewController = AddViewController(nibName: nil, bundle: nil)
    addViewController.delegate = self
    let navController = UINavigationController(rootViewController: addViewController)
    present(navController, animated: true, completion: nil)
}

override func numberOfSections(in tableView: UITableView) -> Int {
    return 2
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    switch section {
    case 0:
        return Int(todos.count)
    case 1:
        return Int(finished.count)
    default:
        return 0
    }

}

override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    switch section {
    case 0:
        return "To do"
    case 1:
        return "Finished"
    default:
        return ""
    }
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "CellIdentifier", for: indexPath) as UITableViewCell
    let index = UInt(indexPath.row)

    switch indexPath.section {
    case 0:
        if let todoItem = todos.object(at: index) as? ToDoItem {
            let attributedText = NSMutableAttributedString(string: todoItem.name)
            attributedText.addAttribute(NSStrikethroughStyleAttributeName, value: 0, range: NSMakeRange(0, attributedText.length))
            cell.textLabel?.attributedText = attributedText
        }
    case 1:
        if let todoItem = finished.object(at: index) as? ToDoItem {
            let attributedText = NSMutableAttributedString(string: todoItem.name)
            attributedText.addAttribute(NSStrikethroughStyleAttributeName, value: 1, range: NSMakeRange(0, attributedText.length))
            cell.textLabel?.attributedText = attributedText
        }
    default:
        fatalError("What did you think ??")
    }
    return cell
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    var todoItem: ToDoItem?

    switch indexPath.section {
    case 0:
        todoItem = todos.object(at: UInt(indexPath.row)) as? ToDoItem
    case 1:
        todoItem = finished.object(at: UInt(indexPath.row)) as? ToDoItem
    default:
        fatalError("What  you think ??")
    }


    //let realm = RLMRealm.default()
    //try! realm.transactionWithBlock() {
    //try! realm.beginWriteTransaction()
    let realm = try! Realm() // 1

    try! realm.write { () -> Void in
        todoItem?.finished = !todoItem!.finished
    }
    //}

    tableView.reloadData()
}

func didFinishTypingText(_ typedText: String?) {
    if (typedText?.utf16.count)! > 0 {
        let newTodoItem = ToDoItem()
        newTodoItem.name = typedText!

        //let realm = RLMRealm.default()
        let realm = try! Realm() // 1

        try! realm.write { () -> Void in//
        //try! realm.transactionWithBlock() {
           //realm.add(newTodoItem)
            realm.add(newTodoItem)
       //}
        }
        tableView.reloadData()
    }
}
}
try! realm.write { 
   ....
}
realm.objects(ToDoItem.self).filter(predicate)