2017-06-18 12 views
1

私はnstableviewとCocoaバインディングを使用しようとしているが動作しないと私は、テキストフィールドのパラメータ値のバインドといくつかの問題を抱えて:私はこのコード、クラスを使用していTextField BindingsNSTableViewのバインディングは、Mac OSスウィフト

を:

class Person : NSObject { 
var givenName:String 
var familyName:String 
var age = 0 
var lol = 0 

override init() { 
    givenName = "given" 
    familyName = "family" 
    lol = 36 
    super.init() 
} 

init(givenName:String, familyName:String, age:Int) { 
    self.givenName = familyName 
    self.familyName = givenName 
    self.age = age 
    self.lol = 36 
    super.init() 
} 

とビューコントローラ:

class ViewController: NSViewController { 

@IBOutlet weak var tableViewL: NSTableView! 

@IBOutlet var superResultsController: NSArrayController! 

@objc dynamic var array = [Person]() 


override func viewDidLoad() { 
    super.viewDidLoad() 
    array.append(Person(givenName: "sas", familyName: "gfg", age: 10)) 
    array.append(Person(givenName: "sddsgds", familyName: "gfg", age: 10)) 
    array.append(Person(givenName: "uoijh", familyName: "gfg", age: 10)) 
    print(superResultsController.arrangedObjects) 
} 

私は私のクラスの任意の変数にテキストフィールドを結合しないことが判明 - アプリはbad_instructionエラーでクラッシュします。

ここでは、アレイコントローラとテーブルビューの私のバインディングです: NSArrayControllerは: NSArrayController bindings

テーブルビュー: table view bindings

+0

[Swift BindingsはXcode 6 Beta 5で動作しません](https://stackoverflow.com/questions/25269436/swift-bindings-wont-work-xcode-6-beta-5)? – Willeke

+0

問題を再現しようとしましたができませんでした。 [my project](http://jmp.sh/28gdbW5)で、コードをコピーして貼り付けた後、ドキュメントのバインドを設定すると、すべてが期待通りに機能します。 –

+0

@PaulPattersonあなたはXcode 9またはXcode 8を使用していますか? –

答えて

1

Cocoaバインディングは、KVOの上に構築されています。また、KVOはisa swizzlingを使用して、自動KVO通知のフックを挿入します。

コンパイラがこれらのプロパティへの呼び出しを最適化しないように、これらのプロパティを動的にマークする必要があります。実行時にこれらのプロパティの取得/設定が常にインスタンスメソッドを通ることを確認することは、KVO機械が動作するために不可欠です。

これらのフィールドをダイナミックとしてマークしないと、動作するように見えます。実行時にバインドが設定されると、テキストフィールドはプロパティを明示的に呼び出して初期値を表示します。しかし、これらのプロパティに加えられた変更はKVO通知を送信せず、テキストフィールドは更新されません。あなたはこれを適切にテストする場合

は、viewDidLoadの最後にこのコードを追加します。

DispatchQueue.main.asyncAfter(deadline: .now() + 2) { 
    self.array[0].givenName = "Some Name" 
    NSLog("Changed the name") 
} 

実行すると、ときに名前が変更テーブルビューが更新されないことがわかります。 dynamicgivenNameに追加してPersonに追加してもう一度実行し、テーブルビューの更新を確認します。

+0

質問は残っています。 Paul Pattersonと私はIgorsプロジェクトを試してみました。私は名前を編集し、 'array'をログし、名前が変更されました。 – Willeke

+0

私が言ったように、動的でないことは、KVO通知が送信されないことを意味します。あなたのデータはもちろん変わります。テーブルビューをリロードすると、新しい値が反映されます。 – pfandrade

+0

私は、ダイナミックな効果をテストする方法を説明したレスポンスを編集しました。 – pfandrade