2011-09-12 36 views
15

Trong ứng dụng của tôi, tôi muốn tạo một hộp thoại với một trường văn bản và một nút, thông qua đó tôi có thể nhắc người dùng và lấy lại giá trị đã nhập của người dùng.Làm thế nào để tạo và nhận được giá trị trả về từ hộp thoại Cocoa?

Làm cách nào để thực hiện điều này trong Cocoa, Objective-C?

Tôi không tìm thấy bất kỳ phương pháp được xác định trước nào cho điều đó.

+2

Không có một phương pháp được xác định trước cho điều đó bởi vì đó là giao diện người dùng xấu . Đó chỉ là một lĩnh vực. –

Trả lời

40

Bạn có thể gọi một NSAlert và đặt NSTextField vì nó là accessoryView như thế này"

- (NSString *)input: (NSString *)prompt defaultValue: (NSString *)defaultValue { 
    NSAlert *alert = [NSAlert alertWithMessageText: prompt 
            defaultButton:@"OK" 
            alternateButton:@"Cancel" 
             otherButton:nil 
         informativeTextWithFormat:@""]; 

    NSTextField *input = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 200, 24)]; 
    [input setStringValue:defaultValue]; 
    [input autorelease]; 
    [alert setAccessoryView:input]; 
    NSInteger button = [alert runModal]; 
    if (button == NSAlertDefaultReturn) { 
     [input validateEditing]; 
     return [input stringValue]; 
    } else if (button == NSAlertAlternateReturn) { 
     return nil; 
    } else { 
     NSAssert1(NO, @"Invalid input dialog button %d", button); 
     return nil; 
    } 
} 
+0

Đừng quên phát hành NSTextField nếu bạn đang tạo nó bằng alloc-init. –

+0

@SebastianHojas họ vẫn cần làm điều đó nếu họ sử dụng ARC để quản lý bộ nhớ? – rd108

+0

@ rd108 Không cần phải cho phép/phát hành khi bạn đang sử dụng ARC. –

7

Tôi tin rằng những gì bạn đang tìm kiếm là một tờ. Hãy nhìn vào các tài liệu Sheet Programming Topics

tôi ve chỉ cập nhật một dự án Github Sample về điều này.Bạn có thể nhập văn bản vào một trường trên trang tính và đưa nó trở lại cửa sổ chính

Ví dụ này cho thấy cách tạo chế độ xem trong ngòi và sử dụng lớp điều khiển trang tính tùy chỉnh tiếng rít h sử dụng một khối như gọi lại, thay vì phải tạo và vượt qua trong một bộ chọn.

14

TRÊN OS X 10.10:

NSAlert *alert = [[NSAlert alloc] init]; 
    [alert setMessageText:@"Permission denied, sudo password?"]; 
    [alert addButtonWithTitle:@"Ok"]; 
    [alert addButtonWithTitle:@"Cancel"]; 

    NSTextField *input = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 200, 24)]; 
    [input setStringValue:@""]; 

    [alert setAccessoryView:input]; 
    NSInteger button = [alert runModal]; 
    if (button == NSAlertFirstButtonReturn) { 
     password = [input stringValue]; 
    } else if (button == NSAlertSecondButtonReturn) { 

    } 
4

Một ví dụ trong Swift như của Xcode 7.2.1 và OS X 10.11:

let a = NSAlert() 
a.messageText = "Please enter a value" 
a.addButtonWithTitle("Save") 
a.addButtonWithTitle("Cancel") 

let inputTextField = NSTextField(frame: NSRect(x: 0, y: 0, width: 300, height: 24)) 
inputTextField.placeholderString = "Enter string" 
a.accessoryView = inputTextField 

a.beginSheetModalForWindow(self.window!, completionHandler: { (modalResponse) -> Void in 
    if modalResponse == NSAlertFirstButtonReturn { 
     let enteredString = inputTextField.stringValue 
     print("Entered string = \"\(enteredString)\"") 
    } 
}) 
Các vấn đề liên quan