2015-04-03 20 views
8

Có cách nào để đặt chuỗi giữ chỗ cho NSTextView như thế trong NSTextField không? Tôi đã kiểm tra tài sản nhưng không thể tìm thấy nó. Tôi đã tìm kiếm một số câu hỏi nhưng không có giải thích đúng.Đặt chuỗi giữ chỗ cho NSTextView

Trả lời

10

Tôi tìm thấy câu trả lời này trực tuyến. Philippe Mougin thực hiện việc này.

static NSAttributedString *placeHolderString; 

@implementation TextViewWithPlaceHolder 

+(void)initialize 
{ 
    static BOOL initialized = NO; 
    if (!initialized) 
{ 
    NSColor *txtColor = [NSColor grayColor]; 
    NSDictionary *txtDict = [NSDictionary dictionaryWithObjectsAndKeys:txtColor, NSForegroundColorAttributeName, nil]; 
    placeHolderString = [[NSAttributedString alloc] initWithString:@"This is my placeholder text" attributes:txtDict]; 
} 
} 

- (BOOL)becomeFirstResponder 
{ 
    [self setNeedsDisplay:YES]; 
    return [super becomeFirstResponder]; 
} 

- (void)drawRect:(NSRect)rect 
{ 
    [super drawRect:rect]; 
if ([[self string] isEqualToString:@""] && self != [[self window] firstResponder]) 
[placeHolderString drawAtPoint:NSMakePoint(0,0)]; 
} 

- (BOOL)resignFirstResponder 
{ 
    [self setNeedsDisplay:YES]; 
    return [super resignFirstResponder]; 
} 

@end 
6

Swift 2,0

var placeHolderTitleString: NSAttributedString = NSAttributedString(string: "Place Holder Value", attributes: [NSForegroundColorAttributeName : NSColor.grayColor()]) 

override func becomeFirstResponder() -> Bool { 
    self.needsDisplay = true 
    return super.becomeFirstResponder() 
} 

override func drawRect(rect: NSRect) { 
    super.drawRect(rect) 

    if (self.string! == "") { 
     placeHolderString.drawAtPoint(NSMakePoint(0, 0)) 
    } 
} 
+0

Điều này cực kỳ hữu ích, nhưng bất kỳ ý tưởng nào về cách làm cho văn bản trình giữ chỗ bị bao bọc trên nhiều dòng? –

7

Swift 4

Khi nó quay ra, đã có vẻ là một tài sản placeholderAttributedString trong NSTextView mà không được tiếp xúc công khai. Vì vậy, bạn chỉ có thể thực hiện nó trong lớp con của riêng bạn và có được hành vi giữ chỗ mặc định (tương tự như NSTextField).

class PlaceholderTextView: NSTextView { 
    @objc var placeholderAttributedString: NSAttributedString? 
} 

Và nếu thuộc tính này sẽ có sẵn trong tương lai, bạn chỉ cần sử dụng NSTextView thay vì lớp con này.

+2

Tôi đã gửi một radar yêu cầu Apple tiết lộ tài sản này http://www.openradar.me/33583675 –

+0

Điều này dường như không hoạt động. Tôi đã triển khai thuộc tính trong một phân lớp nhưng nó không được hiển thị. – Austin

+0

@JanApotheker Có, nó không chắc chắn cho dù đó là trong swift4 hoặc trong 10.13. Điều đó không hoạt động –

Các vấn đề liên quan