【问题标题】:Can't Use Nil for keys or values of PFObject不能将 Nil 用于 PFObject 的键或值
【发布时间】:2016-01-30 17:08:00
【问题描述】:

所以我有这个代码。

@IBAction func updateRatelabel(sender: AnyObject) {
    let rateValue = Int(rateSlider.value)
    if rateValue == 0 {
        rateLabel.text = "Budget (min.)"
    }
    else {
        rateLabel.text = "$ \(rateValue)"
    }
}

func createdoctor()
{
    let doctors =  PFObject(className: "doctors")
    if doctorName.text?.characters.count > 5 {
        doctorName.textColor = UIColor.redColor()   
    }
    else {
        let currentUser  = String( PFUser.currentUser())

        let rateValue =  rateLabel.text
        let rateValueInt = String(rateValue?.characters.dropFirst(2))
        print(rateValueInt)

        doctors["doctorName"] = doctorName.text
        doctors["Rate"] = Int(rateValueInt)
        doctors["doctorContent"] = doctorDetails.text
        doctors["createdby"] = currentUser
        doctors.saveInBackgroundWithBlock ({(success: Bool, error: NSError?) -> Void in
            if error == nil {
                print("created doctor")
            }
            else {
                print("image \(error)")
            }
            let alert = UIAlertController(title: "Success", message: "New doctor Created" , preferredStyle: UIAlertControllerStyle.Alert)
            alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: nil))
            self.presentViewController(alert, animated: true, completion: nil)

        })
    }
}

此代码启动时出现错误,这是正在发生的错误

> 016-01-31 01:00:07.921 idoctortwo[3294:151254] Attempting to load the
> view of a view controller while it is deallocating is not allowed and
> may result in undefined behavior (<UIAlertController: 0x7f8258c8af80>)
> Optional(Swift.String.CharacterView(_core:
> Swift._StringCore(_baseAddress: 0x00007f8258c9b9c2, _countAndFlags: 4,
> _owner: Optional(Swift._HeapBufferStorage<Swift._StringBufferIVars, Swift.UInt16>)))) 2016-01-31 01:00:12.771 idoctortwo[3294:151254] ***
> Terminating app due to uncaught exception
> 'NSInvalidArgumentException', reason: 'Can't use nil for keys or
> values on PFObject. Use NSNull for values.'

我设法发现下面这行代码是罪魁祸首

doctors["Rate"] = Int(rateValueInt)

如果我这样做

doctors["Rate"] = rateValueInt

我没有错误,但我的 Parse 列是一个数字列,因此努力将其设为数字​​。

编辑

2016-01-31 03:58:11.222 iLegaltwo[3662:186816] 尝试加载 视图控制器在释放时的视图是不允许的,并且 可能导致未定义的行为 () 可选(Swift.String.CharacterView(_core: Swift._StringCore(_baseAddress: 0x00007fb2c3667472, _countAndFlags: 4, _owner:可选(Swift._HeapBufferStorage))))2016-01-31 03:58:30.728 iLegaltwo [3662:186900] [错误]:创建的密钥类型无效,应为 *_User,但得到了 字符串(代码:111,版本:1.12.0)图像可选(错误域=解析 Code=111 "创建的密钥类型无效,预期为 *_User,但得到了 string" UserInfo={code=111,temporary=0,error=key 类型无效 createdby,预期 *_User,但得到字符串, NSLocalizedDescription=key createdby 的无效类型,预期 *_User,但得到了字符串})

针对上述错误修改后编辑:

func createCase()
    {
          let cases =  PFObject(className: "Cases")
        if caseName.text?.characters.count > 5
        {

            caseName.textColor = UIColor.redColor()

        }
        else
        {

            let currentUser  = String( PFUser.currentUser())


            let rateValue =  rateLabel.text
            let rateValueInt = String(rateValue?.characters.dropFirst(2))
            print(rateValueInt)

        cases["CaseName"] = caseName.text
        cases["Rate"] = Int(rateValueInt) ?? Int(0)
        cases["CaseContent"] = caseDetails.text
            cases["createdby"] = currentUser
        cases.saveInBackgroundWithBlock ({(success: Bool, error: NSError?) -> Void in
            if error == nil
            {
                print("created case")
            }
            else
            {
                print("image \(error)")
            }
                self.performSelectorOnMainThread("success", withObject: nil, waitUntilDone: true)
        })
        }


    }

    func success() {
        let alert = UIAlertController(title: "Success", message: "New doctor Created" , preferredStyle: UIAlertControllerStyle.Alert)
        alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: nil))
        self.presentViewController(alert, animated: true, completion: nil)
    }

【问题讨论】:

  • 你现在在一个帖子中有 2 个不同的问题,这很遗憾:你当然可以两个都 +1,但你不能同时批准两个......
  • 我相信你的第二个答案和我的第二个问题是这个问题的重点,正如我提到的,我设法弄清楚如何让它 INT 面对这个丑陋的输出。

标签: ios swift parse-platform int


【解决方案1】:

无法从后台线程触摸 UI

从主线程推送视图控制器。罪魁祸首:

saveInBackgroundWithBlock...
    self.presentViewController

解决方案

- use `performSelectorOnMainThread`
- use dispatch_async(dispatch_get_main_queue(), ^(void) { } })

示例

将警报创建替换为

self.performSelectorOnMainThread("success", withObject: nil, waitUntilDone: true)

并添加此方法:

func success() {
    let alert = UIAlertController(title: "Success", message: "New doctor Created" , preferredStyle: UIAlertControllerStyle.Alert)
    alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: nil))
    self.presentViewController(alert, animated: true, completion: nil)
}

【讨论】:

  • 查看我编辑的问题(编辑 2),如果这是正确的,那么不幸的是它仍然有同样的错误。
  • 哦!对不起我的坏!真对不起!我想你也可能忽略了它,错误消息说 _User,然后如果你注意到我有这行代码。案例["createdby"] = currentUser
  • 好吧,停止将当前用户转换为字符串已经防止了错误!作为我数据库中的当前用户,我已更改为指针,并且我试图传递一个字符串而不是原始 objectID,因此我收到了该错误。但很高兴你为我指明了正确的方向,谢谢!
  • 确实,我忽略了*_User, but got string错误!
【解决方案2】:

字典键/值不能为 nil

Int("someString") 不返回 Int,而是返回可选的 Int?

documentation 将这些访问器列为 数组访问器,而实际上,使用 key/value,它们应该被视为 字典访问器 .

因此,您应该将PFObject 视为字典包装器:不能为键或值传递 nil。您将 对象 存储在字典中,而不是可选项。

扭曲

Int(rateValueInt) 最终成为 Int?,因为 Int(rateValueInt) 转换。

解决方案

doctors["Rate"] = Int(rateValueInt) ?? Int(0)

这将显式替换 Int,以防 Int(rateValueInt) 无法解包。

【讨论】:

  • 但仍然出现这个丑陋的错误,请参阅我的问题的编辑。
  • 不是同一个错误,也不是复合错误。添加了第二个响应(每个错误一个)。你可能两者都需要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-26
  • 2014-07-25
相关资源
最近更新 更多