2010-12-30 36 views
17

Tôi đang cố gắng lấy văn bản từ chế độ xem cảnh báo và thêm văn bản đó vào mảng có thể thay đổi của tôi để liệt kê trong chế độ xem bảng. Tôi nhận ra có một câu hỏi tương tự đã được đăng một vài tháng trước, nhưng tôi không hiểu làm thế nào để sử dụng câu trả lời nhất định.Lấy văn bản từ UIAlertView

-(IBAction)insert { 
    UIAlertView* dialog = [[UIAlertView alloc] init]; 
    [dialog setDelegate:self]; 
    [dialog setTitle:@"Enter Name"]; 
    [dialog setMessage:@" "]; 
    [dialog addButtonWithTitle:@"Cancel"]; 
    [dialog addButtonWithTitle:@"OK"]; 

    UITextField *nameField = [[UITextField alloc] initWithFrame:CGRectMake(20.0, 45.0, 245.0, 25.0)]; 
    [nameField setBackgroundColor:[UIColor whiteColor]]; 
    [dialog addSubview:nameField]; 
    [dialog show]; 

    [data addObject:[nameField text]]; 
    [mainTableView reloadData]; 

Tuy nhiên, ứng dụng của tôi gặp sự cố vì tôi đang cố gắng chèn đối tượng nil vào chỉ mục 0. Tôi đang làm gì sai?

EDIT: Ok Tôi nghĩ rằng tôi thiếu phương thức để xử lý chế độ xem cảnh báo. Vì vậy, tôi thấy điều này:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 
    NSString *buttonTitle=[alertView buttonTitleAtIndex:buttonIndex]; 
    if([buttonTitle isEqualToString:@"Cancel"]) { 
     return; 
    } 
    else if([buttonTitle isEqualToString:@"Ok"]) { 
     [data addObject:nameField.text]; 

    } 

Bây giờ tôi chỉ cần kết nối các phần, nhưng không chắc chắn như thế nào.

Trả lời

45

Sai lầm phổ biến mà mọi người mắc phải khi sử dụng UIAlertView là họ cho rằng gửi tin nhắn show sẽ chặn chuỗi chính. Nó không. Mã của bạn tiếp tục thực thi, mặc dù có một cảnh báo trên màn hình. Do đó, không có giá trị nào cho số UITextField mà bạn đã chuyển.

Những gì bạn cần làm là triển khai UIAlertViewDelegate trong số UIViewController để lấy bất kỳ nội dung nào người dùng đã nhập vào trường văn bản. Điều đó nói rằng, bạn vẫn phải kiểm tra giá trị nil, bởi vì nếu bạn không nhập bất kỳ giá trị nào, giá trị text sẽ là nil.

CẬP NHẬT: Câu trả lời này đã được đăng trước khi Apple tạo API để thêm UITextField vào cảnh báo qua UIAlertViewStyle. Đây là mã được cập nhật, vay mượn từ @ Matt

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Enter Name" 
               message:@" " 
               delegate:self 
             cancelButtonTitle:@"Cancel" 
             otherButtonTitles:@"OK", nil]; 
alert.alertViewStyle = UIAlertViewStylePlainTextInput; 
[alert show]; 

Sau đó, trong UIAlertViewDelegate gọi lại:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 
    if (buttonIndex == 1) { 
     NSString *name = [alertView textFieldAtIndex:0].text; 
     // Insert whatever needs to be done with "name" 
    } 
} 
+0

Ứng dụng của tôi là một ứng dụng dựa trên cửa sổ. Điều này có quan trọng không? – Snowman

+0

@ f-Prime Không, nó không quan trọng. Chúng tôi đang đi qua hệ thống phân cấp của UIAlertView. –

+0

Ok vậy mã hoàn chỉnh của tôi trông như thế nào? Phương pháp thêm của tôi cộng với phương thức clickButtonAtIndex của bạn và nó sẽ hoạt động? Tôi có phải gọi clickButtonAtIndex trong phương pháp thêm của tôi không? Cuz như bây giờ, nó không hoạt động – Snowman

0

– alertView:clickedButtonAtIndex: là phương thức ủy quyền của UIAlertView. Chỉ cần thêm phương thức bạn đã xác định trong bản chỉnh sửa của mình vào việc thực hiện bộ điều khiển và bạn nên làm tốt, vì bạn đã đặt bộ điều khiển làm đại diện của AlertView.

Cũng thêm vào tiêu đề lớp học của bạn, để tránh bất kỳ cảnh báo đại biểu liên quan, ví dụ:

@interface MyViewController : UIViewController <UIAlertViewDelegate> { 
... 
}; 

Đừng quên để loại bỏ [data addObject:[nameField text]];[mainTableView reloadData]; từ phương pháp chèn.

+0

Ok tôi đã làm điều đó nhưng tôi nhận được một lỗi "tên miền undeclared" trong phương thức clicksButtonAtIndex – Snowman

0
UIAlertView *myAlert = [[UIAlertView alloc] initWithTitle:@"Alert title" 
                message:@"alert message" 
               delegate:self 
             cancelButtonTitle:@"Cancel" 
             otherButtonTitles:@"Ok", nil]; 
[myAlert addTextFieldWithValue:nil label:@"<place holder>"]; 
[[myAlert textField] setTextAlignment:UITextAlignmentCenter]; 
[[myAlert textField] becomeFirstResponder]; 
[myAlert show]; 
[myAlert release]; 
myAlert = nil;    

Không cần phải thêm một textfield tùy chỉnh. Bạn có thể trực tiếp thêm bằng phương thức addTextFieldWithValue.

+0

UIAlertView dường như không có phương thức 'addTextFieldWithValue: label:' –

3

Đừng cố thêm UITextView trên UIAlertView nếu không Apple có thể từ chối ứng dụng của bạn.

Tôi đã sử dụng cùng một loại chức năng trong ứng dụng của mình. Nhưng Apple ĐƯỢC TIẾP TỤC ỨNG DỤNG CỦA TÔI do việc sử dụng UITextView trong UIAlertView.

27

Bạn không cần phải thêm lĩnh vực văn bản của riêng bạn để AlertView nhưng thay vì thiết lập các phong cách phù hợp

UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Enter Name" 
               message:@" " 
               delegate:self 
             cancelButtonTitle:@"Cancel" 
             otherButtonTitles:@"OK", nil]; 
alert.alertViewStyle = UIAlertViewStylePlainTextInput; 
[alert show]; 

Sau đó truy cập vào văn bản đã nhập sau khi OK (nút 1) đã ép

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex 
{ 
    if (buttonIndex == 1) { 
     NSString *name = [alertView textFieldAtIndex:0].text; 
     // name contains the entered value 
    } 
} 
+0

Lưu ý: chỉ hoạt động trên iOS5 + –

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