2011-05-11 15 views
8

Xcode kullanmayı öğrenmeye çalışıyorum ama NSTextField'un nasıl değiştiğini öğrenmek için kafam karışıyor. Esasen, bir NSTextField ve bir düğme var. Düğmeye tıklamak, alandaki metinle ilgilenir. Ancak, alanın metnini "Eylem: son kurgu üzerine gönder" i kullanmak zorunda kalmadan alan metnini elde edebilmek istiyorum. Yani, metin girebilmek ve hemen metin kutusuna girmeden veya sekmeden dokunmadan düğmeye basmak istiyorum.NSTextField temsilci bildirimleri - metin nasıl alınır?

- (void)controlTextDidChange:(NSNotification *)aNotification 

yanıt benim NSTextField için temsilci ayarlayarak olacağını yapmaya yol gibi görünüyor Ama girildikten metni nasıl anlamıyorum.

ile ilgili bir şey olduğunu varsayalım, ancak buradan nereye gideceğimiz konusunda hiçbir fikrim yok. Düğme eylem yönteminde

cevap

10

Doğru yoldasınız! Bildirimin kullanıcı bilgisi sözlüğünden çıkardığınız nesne, metin alanının adına metin girişini işleyen NSTextView olan Field Editor'dur.

Bu nesneye sahip olduğunuzda, tek yapmanız gereken metni tutan NSTextStorage * nesnesine ait textStorage sorusunu sormaktır. Bu nesne, sırayla, sadece karakterleri tutan sade bir NSString olan string vardır. Bir nesne bir dize tutan ve ilişkili NSAttributedString bir alt sınıfı, renk, yazı tipi, altı çizili gibi "özellikleri" *

NSTextView * fieldEditor = [[aNotification userInfo] objectForKey:@"NSFieldEditor"]; 
NSString * theString = [[fieldEditor textStorage] string]; 

. Eğer daima yalnızca bir metin alanını ele ediyorsanız

+0

"-valueForKey:" yerine -objectForKey: 'seçeneğini önerebilir miyim? Birincisi bir sözlükten değer elde etmek için kanonik yöntemdir. –

+0

@Bavarious: Her zamanki gibi haklısın! Buradaki suçluluk, OP'nin kod satırını kopyalamayı dikkatlice okumadan yapıştırdı. –

+0

Teşekkürler! Bu harika çalışıyor! – Daniel

2

, sadece metin alanına geçerli dize değeri okuyun:

- (IBAction)didClickTheButton:(id)sender { 

    NSString* theString = [myTextField stringValue]; 

    // do something with theString 

} 
+0

Vay, bu daha kolay. Neden bu kadar katı gibi görünen diğer cevaplar, şu anda daha yüksek puan aldı? – SilverSideDown

+0

@SilverSideDown En azından soruyu sorduğumda, bu kullanıcı sekme işlemi yapmadan veya geri dönüşü olmadan girilmiş metni kaydetmez. – Daniel

+2

Veri bağlamaları kullanıyorsanız "Sürekli Güncelleştirmeler Değeri" seçeneğini ayarlayabilir ve geri dönüş veya sekmeye gerek duymadan yazdığınız sırada ciltleme değerini günceller. -stringValue yöntemini çağırmak, geçerli metni NSTextField öğesinde, bağımsız olarak döndürür. – Darren

0

, bu basit olabilecek:

- (void)controlTextDidChange:(NSNotification *)obj { 
    [self.inputField stringValue]; 
} 

Tamamen bütün karmaşık NSText ayrıntılarını ve etajer görmezden ve sadece olmanın bildirim sadeliği kullanıyorum bir metin alanından dize değerini almanın basitliği ve sadeliği.