swift-Protokoll, IBOutlet property kann nicht nicht-Objekt-Typ
Möchte ich Draht, ein eigenes swift-Delegierter in der IB. Der Delegat ist ein Objekt, das implementiert eine bestimmte protocol in swift.
protocol ThumbnailTableViewCellDelegate {
func cellWasTouched(thumbnail: Bool, cell: UITableViewCell)
}
class ThumbnailTableViewCell: UITableViewCell {
@IBOutlet var thumbnailTableViewCellDelegate: ThumbnailTableViewCellDelegate?
}
leider, der compiler beschwert sich mit:
error: 'IBOutlet' property cannot have non-object type 'ThumbnailTableViewCellDelegate'
@IBOutlet var thumbnailTableViewCellDelegate: ThumbnailTableViewCellDelegate?
^~~~~~~~~
- Es ist völlig in Ordnung - du sagst es ist ein Objekt, entspricht, der Protokoll.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie deklarieren Ihre
ThumbnailTableViewCellDelegate
Protokoll als@objc
:Dies ist, weil
@IBOutlet
deklariert die variable alsweak
, das funktioniert nur mit Objekten. Ich bin mir nicht sicher, warum Sie nicht einfach sagen das Protokoll entsprichtAnyObject
vielleicht ist das Swift-bug.@objc protocol
Sie können erklären, Ihr Protokoll als Klasse-nur, wie diese:protocol ThumbnailTableViewCellDelegate: class
für den gleichen Effekt und ohne die möglichen Nachteile von Xcode zwingt Sie, haben Sie dieses Protokoll, kompatibel mit Objective-CKönnen Sie in connect Ihre eigenen Protokolle, die im IB mit dieser Problemumgehung. Es ist ein bekanntes Problem mit Xcode, so wird wahrscheinlich gelöst werden, eines Tages. Bis dann:
Dies funktioniert für mich.
Nicht ideal, aber eine option ist, so etwas zu tun:
Bekam, um sicherzustellen, dass Ihr
objectType
entsprichtSomeProtocol
oder Dinge, die explodieren wird,Variable Protokoll geben könnte, nicht ein Objekt sein, da structs und enums können entsprechen, um Protokolle zu. Um sicherzustellen, dass ein Protokoll können nur erfüllt von Klassen, können Sie erklären, das Protokoll mit
@class_protocol
.Macht es Art von Gefühl, dass IB erfordert AnyObject, anstatt Ihre besonderen Protokoll. Das Objekt, das Sie verbinden möchten, wahrscheinlich, aber nicht zwangsläufig ist, entspricht dem Protokoll, und das Protokoll kann haben Optionen - so:
Stellen Sie Ihr Protokoll so:
Deklarieren Sie in Ihrer Klasse wie diese zum Beispiel:
Und wenn Sie kommen, es zu benutzen, überprüfen Sie, dass es entspricht dem Protokoll, und dass die Optionen vorhanden sind - wie diese:
IBOutlets werden, um anzuzeigen, dass ein Zeiger auf ein Objekt gespeichert, in eine Spitze (oder storyboard) - Datei. Ein Protokoll ist kein Objekt, daher können Sie nicht haben, in einer nib-Datei. Stellen Sie den Typ des IBOutlet var den Typ, der das eigentliche Objekt Sie haben in den nib.