将尝试通过打破约束来恢复 <NSLayoutConstraint:0x17008b130 UILabel

Will attempt to recover by breaking constraint <NSLayoutConstraint:0x17008b130 UILabel

我正在将我的 swift 应用程序连接到低功耗蓝牙外围设备。我是 Swift 的新手,我的问题完全与 swift 编码有关,而不是 BLE。

我监听外设看按钮是否按下。我定义了一个标签并为其分配了一个文本。当应用检测到按下按钮时,我希望更改标签测试,但我的应用却崩溃了。

你可以在这里看到我的代码:

   import CoreBluetooth
import UIKit

class ViewController: UIViewController, CBCentralManagerDelegate, CBPeripheralDelegate {

    var manager:CBCentralManager!
    var peripheral:CBPeripheral!
    @IBOutlet weak var statusLabel: UILabel!


    let BEAN_NAME = "Security Tag"
    let BEAN_SCRATCH_UUID = CBUUID(string: "00001C0F-D102-11E1-9B23-000EFB0000A7")
    let BEAN_SERVICE_UUID = CBUUID(string: "00001c00-d102-11e1-9b23-000efb0000a7")

    override func viewDidLoad() {
        super.viewDidLoad()
        manager = CBCentralManager(delegate: self, queue: nil)
    }

    func centralManagerDidUpdateState(_ central:CBCentralManager) {
        if central.state == CBManagerState.poweredOn {
            central.scanForPeripherals(withServices: nil, options: nil)
            debugPrint("Searching ...")
        } else {
            debugPrint("Bluetooth not available.")
        }
    }

    func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
        let device = (advertisementData as NSDictionary).object(forKey: CBAdvertisementDataLocalNameKey) as? NSString

        if device?.contains(BEAN_NAME) == true {
            debugPrint("Found Bean.")

            self.manager.stopScan()
            self.peripheral = peripheral
            self.peripheral.delegate = self

            manager.connect(peripheral, options: nil)
        }
    }

    func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
        debugPrint("Getting services ...")
        peripheral.discoverServices(nil)
    }

    func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
        for service in peripheral.services! {
            let thisService = service as CBService

            debugPrint("Service: ", service.uuid)

            if service.uuid == BEAN_SERVICE_UUID {
                debugPrint("Using scratch.")
                peripheral.discoverCharacteristics(nil, for: thisService)
            }
        }
    }

    func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
        debugPrint("Enabling ...")

        for characteristic in service.characteristics! {
            let thisCharacteristic = characteristic as CBCharacteristic

            debugPrint("Characteristic: ", thisCharacteristic.uuid)

            if thisCharacteristic.uuid == BEAN_SCRATCH_UUID {
                debugPrint("Set to notify: ", thisCharacteristic.uuid)

                // Prepare to show data

                self.peripheral.setNotifyValue(true, for: thisCharacteristic)
           }
        }
    }

    func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
        if characteristic.uuid == BEAN_SCRATCH_UUID {
            let content = String(data: characteristic.value!, encoding: String.Encoding.utf8)

            debugPrint("Notified.")
            self.statusLabel.text = "Your Purchase is Registered."

        }
    }

    func centralManager(_ central: CBCentralManager, didDisconnectPeripheral peripheral: CBPeripheral, error: Error?) {
        debugPrint("Disconnected.")

        central.scanForPeripherals(withServices: nil, options: nil)

        // Hide respective user interface
    }

}

行说:self.statusLabel.text = "Your Purchase is Registered."

是我得到异常的地方。

这是我得到的错误:

    2017-02-06 13:42:19.825869 kevinbletest[2143:695095] [LayoutConstraints] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. 
    Try this: 
        (1) look at each constraint and try to figure out which you don't expect; 
        (2) find the code that added the unwanted constraint or constraints and fix it. 
(
    "<NSLayoutConstraint:0x17008b130 UILabel:0x11dd0cbf0'Waiting for a Purchase Co...'.width == 270   (active)>",
    "<NSLayoutConstraint:0x17008b770 UILabel:0x11dd0cbf0'Waiting for a Purchase Co...'.centerX == UIView:0x11dd0c850.centerX   (active)>",
    "<NSLayoutConstraint:0x17008b7c0 UILabel:0x11dd0cbf0'Waiting for a Purchase Co...'.leading == UIView:0x11dd0c850.leadingMargin + 50   (active)>",
    "<NSLayoutConstraint:0x17408c3f0 'UIView-Encapsulated-Layout-Width' UIView:0x11dd0c850.width == 375   (active)>"
)
    Will attempt to recover by breaking constraint 
    <NSLayoutConstraint:0x17008b130 UILabel:0x11dd0cbf0'Waiting for a Purchase Co...'.width == 270   (active)>    
    Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
    The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
    fatal error: unexpectedly found nil while unwrapping an Optional value
    2017-02-06 13:42:25.299886 kevinbletest[2143:695095] fatal error: unexpectedly found nil while unwrapping an Optional value
    (lldb) 

尝试在故事板中为该标签设置一些内容,看看是否会触发视觉警告。我怀疑您已经设置了假设标签具有特定宽度的约束,当您分配与情节提要中的文本字符串不同的文本字符串时,该宽度会被破坏。要解决这个问题,请尝试更改约束值以适应动态文本 - 例如将尾随约束设置为大于或等于您的最小填充(例如 8px)。

根据我的阅读,错误在于:

<NSLayoutConstraint:0x17008b130 UILabel:0x11dd0cbf0'Waiting for a Purchase Co...'.width == 270   (active)>

如果您在下面阅读它,似乎 NSLayout 试图将宽度为 270 的标签居中,但失败了,因为您的文本大于 270。

在下面它说你的应用程序崩溃是因为你的标签实际上是零。

试试printf(self.myLabel)看看是不是nil。

如果您将标签添加到情节提要中并在 viewDidAppear 完成之前按下按钮,则您的标签可能为零。

也可以无拘无束地尝试一下。只需删除约束。 + 等到 ViewController 加载完毕 (viewDidAppear) 然后点击。

你的应用程序崩溃是因为它解包了一个 nil 的可选值,而不是因为约束。