5

Tôi có một trình soạn thảo ngữ, trong đó các mẫu được tạo ra thông qua như sau:NSPredicateEditor & NSExpression - Có thể hiển thị khác với giá trị của biến vị ngữ không?

NSArray * test = [NSArray arrayWithObjects: 
         [NSExpression expressionForKeyPath: @"Abc"], 
         [NSExpression expressionForKeyPath: @"Def"], 
         nil]; 


    NSPredicateEditorRowTemplate * template = [[NSPredicateEditorRowTemplate alloc] initWithLeftExpressions: test 
            rightExpressionAttributeType: NSStringAttributeType 
                 modifier: NSDirectPredicateModifier 
                 operators: [NSArray arrayWithObject: 
                   [NSNumber numberWithUnsignedInteger:NSContainsPredicateOperatorType]] 
                 options:(NSCaseInsensitivePredicateOption|NSDiacriticInsensitivePredicateOption)]; 

Vì vậy, nếu tôi điền vào một trình soạn thảo vị như thế này: Predicate Editor

Khi tôi thoát ra vị tạo ra tôi nhận được :

Abc CONTAINS[cd] "abc" OR Def CONTAINS[cd] "def"

những gì tôi đang tự hỏi là nếu tôi bằng cách nào đó có thể có các biên tập viên vị mẫu màn hình khác nhau so với giá trị được đặt trong vị từ được tạo.

EX: Tôi muốn vị đầu ra phải có:

Field1 CONTAINS[cd] "abc" OR Field2 CONTAINS[cd] "def"

Mặc dù biên tập vẫn hiển thị abcdef như các lĩnh vực. Điều này có thể không?

Trả lời

9

Có, bạn có thể thực hiện việc này.

Bạn muốn mảng biểu thức bên trái là các keyPath thực tế trong vị từ cuối cùng. Trong trường hợp của bạn, "Field1""Field2".

Đối với thực hiện một giá trị khác nhau xuất hiện trong cửa sổ bật lên, đây là nơi một khái niệm tâm-uốn do thỏa thuận hợp:

Bạn sẽ khoanh vùng biên tập ngữ của bạn sang tiếng Anh.

Có hai cách bạn có thể thực hiện việc này.

  1. Với .strings nộp
  2. Với một NSDictionary

Với a.chuỗi nộp

Trong nguồn của bạn, bạn có thể bao gồm những điều sau đây trong một chú thích:

// NSLocalizedStringFromTable(@"%[Field1,Field2]@ %[contains]@ %@", @"PredicateEditor", @"") 

Khi bạn chạy genstrings trên mã nguồn của bạn, điều này sẽ tạo ra một file PredicateEditor.strings với các mục sau:

"%[Field1]@ %[contains]@ %@" = "%[Field1]@ %[contains]@ %@"; 
"%[Field2]@ %[contains]@ %@" = "%[Field2]@ %[contains]@ %@"; 

Bạn sẽ thay đổi các giá trị thành:

"%[Field1]@ %[contains]@ %@" = "%[Abc]@ %[contains]@ %@"; 
"%[Field2]@ %[contains]@ %@" = "%[Def]@ %[contains]@ %@"; 

Sau đó, khi bạn tạo NSPredicateEditor, bạn sẽ đặt thuộc tính formattingStringsFileName thành "PredicateEditor" và trình chỉnh sửa sẽ xử lý phần còn lại.

Với một NSDictionary

Điều này sẽ làm theo các khái niệm cơ bản tương tự như tùy chọn .strings, ngoại trừ việc bạn về cơ bản sẽ làm gì:

NSDictionary *formatting = @{ 
    @"%[Field1]@ %[contains]@ %@" : @"%[Abc]@ %[contains]@ %@", 
    @"%[Field2]@ %[contains]@ %@" : @"%[Def]@ %[contains]@ %@" 
} 
[myPredicateEditor setFormattingDictionary:formatting]; 

Đó là tất cả các bạn phải làm.

I blogged about this một thời gian dài trước đây và có nhiều thông tin hơn mà bạn có thể thấy hữu ích.

+0

Điều cần lưu ý, trong trường hợp trên, bạn không thể thay đổi công cụ sửa đổi, trong trường hợp thay đổi '% [contains] @' cần giữ tất cả các tùy chọn có thể hiển thị ở đó.Đối với tôi, để có được bản địa hóa trên mỗi tùy chọn tôi cần phải sửa đổi đó là: '% [nhỏ hơn, nhỏ hơn hoặc bằng, lớn hơn, lớn hơn hoặc bằng, là, không, chứa, bắt đầu bằng, kết thúc bằng] @ ' – utahwithak

1

Về cơ bản bạn muốn sửa đổi tiêu đề của các mục menu trong nút bật lên của bạn. Đó là tất cả những gì bạn cần làm. Nó sẽ không ảnh hưởng đến vị từ cơ bản mà bạn được trả về. Nếu bạn đã tạo nó trong trình xây dựng giao diện, thật dễ dàng để lấy các mục menu của một mẫu và đặt tiêu đề của chúng. Nhưng kể từ khi bạn đã làm điều này trong mã, bạn sẽ phải sửa chữa nó trong mã.

Đây là cách bạn có thể làm điều đó. Trong lớp mẫu hàng của tôi, tôi muốn thay đổi chiều rộng của NSTextFields của mình. Vì vậy, trong mẫu hàng của tôi lớp tôi nhìn cho họ và thay đổi chúng như thế này ...

- (void)awakeFromNib { 
    NSArray* views = [self templateViews]; 
    for (id view in views) { 
     if ([[view class] isEqual:[NSTextField class]]) { 
      NSRect tfFrame = [view frame]; 
      tfFrame.size.width = 600; 
      [view setFrame:tfFrame]; 
     } 
    } 
} 

Bạn có thể thấy rằng tôi nhận được templateViews và tìm kiếm các NSTextFields ... và sau đó thay đổi chúng. Bạn có thể làm một cái gì đó tương tự tìm kiếm NSPopupButtons. Một khi bạn tìm thấy một kiểm tra tiêu đề mục trình đơn của họ và tìm những người có tiêu đề "abc" và "def" và thay đổi tiêu đề của họ để "Field1" và "Field2" tương ứng.

0

Thay vì sử dụng NSLocalizedString với literals tùy chọn định dạng cụ thể và genstrings để tạo ra chuỗi nội địa hóa, có vẻ như dễ dàng hơn/sạch hơn để tạo ra chuỗi tập tin localization thức .strings mình.

From this blog post, chúng ta có thể sử dụng API Private _generateFormattingDictionaryStringsFile để có được những chuỗi định dạng từ NSPredicateEditor bản thân:

extension NSPredicateEditor { 

    func formattingDictionaryStrings() -> String? { 
     var strings: String? = nil 

     if let formattingDictionaryData = self.perform(Selector("_generateFormattingDictionaryStringsFile"))?.takeRetainedValue() as? Data { 
      strings = String(data: formattingDictionaryData, encoding: .utf16) 
     } 

     return strings 
    } 

} 

này tạo ra tất cả các hoán vị, bỏ qua nhu cầu genstrings. Sau đó, bạn thay thế các mã thông báo ở bên phải của = bằng các chuỗi do người dùng hiển thị của bạn.

"%[ABC]@ %[is]@ %[123]@" = "%1$[ABC]@ %2$[is]@ %3$[123]@"; 
"%[ABC]@ %[is]@ %[456]@" = "%1$[ABC]@ %2$[is]@ %3$[456]@"; 
"%[ABC]@ %[is]@ %[789]@" = "%1$[ABC]@ %2$[is]@ %3$[789]@"; 
"%[ABC]@ %[contains]@ %[123]@" = "%1$[ABC]@ %2$[contains]@ %3$[123]@"; 
"%[ABC]@ %[contains]@ %[456]@" = "%1$[ABC]@ %2$[contains]@ %3$[456]@"; 
"%[ABC]@ %[contains]@ %[789]@" = "%1$[ABC]@ %2$[contains]@ %3$[789]@"; 

Thậm chí tốt hơn, bạn có thể xây dựng các mã mà xây dựng mỗi NSPredicateEditorRowTemplate lấy làm đầu vào cả keypath sử dụng trong nội vị và chuỗi địa hoá cho tùy chọn đó.

Phương pháp của bạn sau đó có thể tạo chuỗi ở trên, nhưng với bản địa hóa chính xác đã được chèn.

LƯU Ý: gọi _generateFormattingDictionaryStringsFile phương pháp API tin này dường như gây ra tai nạn ngẫu nhiên trong NSPredicateEditor:

lớp này không phải là giá trị quan trọng mã hóa tuân thủ cho phím rowType.

Vì vậy, hãy chắc chắn chạy nó một lần khi cần thiết, nhưng đừng để nó hoạt động khi bạn thường chạy hoặc thử nghiệm ứng dụng của bạn.

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