2009-02-21 28 views
5

Tôi cần chạy một vài xác thực phụ thuộc vào quyết định của người dùng (ví dụ: nếu phê duyệt mua hàng vượt quá giới hạn chi tiêu) và từ chối hành động "đã hoàn tất" nếu không thành công.UIAlertView thực sự trong iPhone?

Tuy nhiên, có vẻ như không thể có một hành động thực sự giống như với các ngôn ngữ khác (như showmessage, alert(), vv) và mọi thứ đều do đại biểu.

Nhưng sau đó tôi không biết phải làm gì. Nếu người dùng nhấn nút "thực hiện", chương trình sẽ hỏi "Bạn có chắc chắn điều này không?" và anh ta nói "hủy bỏ" dòng chảy vẫn tiếp tục và khung nhìn bị đẩy lùi lại!

Cách giải quyết vấn đề này trong thế giới cacao?

Trả lời

7

Giải pháp là không để chống lại nó, chỉ cần chia logic của bạn thành hai phần. Nếu người dùng nhấp hủy, không thực hiện phần thứ hai. Nếu người dùng nhấp OK/Tiếp tục, hãy thực hiện phần thứ hai.

Vấn đề chính gây ra bằng cách chặn luồng chính là chủ đề chính là điều xử lý sự kiện. Cách xử lý sự kiện cổ điển có thể giới thiệu các lỗi xử lý sự kiện lạ, bởi vì bạn không có một vòng lặp sự kiện, thay vào đó bạn có nhiều vòng lặp sự kiện được nhúng bên trong một sự kiện khác.

Bằng cách sử dụng các đại biểu, bạn có thể sử dụng một vòng lặp sự kiện (được gọi thông qua UIApplicationMain) và không có bất kỳ sự kiện xử lý sự kiện nào trong số này.

+3

Nói cách khác, hoàn toàn sắp xếp lại mã của bạn và cầu nguyện rằng ngày trước khi bạn được lên kế hoạch phát hành, bạn sẽ không yêu cầu người dùng quay trở lại yêu cầu xác minh ngay giữa một phép tính lớn, phức tạp với một nhóm của các biến cục bộ. – GeneralMike

+1

+1 không đấu tranh. –

0

Giữ trạng thái của ứng dụng ở nơi khác ngoài các biến trong hàm. Ví dụ: trong một trong các ứng dụng của tôi, có một chuỗi tiểu sử cho biết liệu họ có đồng ý với chính sách bảo mật hay không.

0

Tôi vừa chạy vào câu hỏi này dưới dạng câu hỏi MonoTouch và trong khi nghiên cứu giải pháp, chạy vào câu hỏi mở này.

Câu trả lời ngắn gọn là có, điều này là có thể. Mẫu sau đây cho thấy cách thực hiện điều này với MonoTouch và C# trên iPhone, nhưng nguyên tắc tương tự áp dụng cho Objective-C.

Để thực hiện việc này, những gì bạn có thể làm là chạy thủ công mainloop. Tôi đã không quản lý để ngăn chặn các mainloop trực tiếp, vì vậy tôi thay vì chạy mainloop trong 0,5 giây và chờ cho đến khi người dùng phản ứng.

Chức năng sau đây cho thấy làm thế nào bạn có thể thực hiện một truy vấn phương thức với cách tiếp cận trên:

int WaitForClick() 
{ 
    int clicked = -1; 
    var x = new UIAlertView ("Title", "Message", null, "Cancel", "OK", "Perhaps"); 
    x.Show(); 
    bool done = false; 
    x.Clicked += (sender, buttonArgs) => { 
     Console.WriteLine ("User clicked on {0}", buttonArgs.ButtonIndex); 
    clicked = buttonArgs.ButtonIndex; 
    };  
    while (clicked == -1){ 
     NSRunLoop.Current.RunUntil (NSDate.FromTimeIntervalSinceNow (0.5)); 
     Console.WriteLine ("Waiting for another 0.5 seconds"); 
    } 

    Console.WriteLine ("The user clicked {0}", clicked); 
    return clicked; 
} 
3

Check-out: http://code.google.com/p/modal-uialertview-uiactionsheet/

Với nó, bạn có thể làm những việc như:

UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:nil delegate:nil cancelButtonTitle:@"Cancel" destructiveButtonTitle:@"Delete" otherButtonTitles:nil]; 
if ([actionSheet showModalInView:self.view] == actionSheet.destructiveButtonIndex) { 
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:nil message:@"Do you want to delete this file?" delegate:nil cancelButtonTitle:@"No" otherButtonTitles:@"Yes", nil]; 
    if ([alertView showModal]!= alertView.cancelButtonIndex) { 
     // Delete the file 
    } 
} 
+0

Cách này hoạt động tốt hơn phương pháp riêng tư [alert setRunsModal: YES] vì với việc triển khai của Apple, cảnh báo đầu tiên bị hủy khi bạn hiển thị thông báo thứ hai. Tuy nhiên với việc triển khai này, bạn có thể có các cảnh báo lồng nhau. – malhal

0

Tôi đồng ý với NilObject rằng bạn thường không nên chống lại nó, và nói chung là không. Nhưng tôi đang sử dụng khung AddressBookUI và khi tôi đang sử dụng phương thức ủy nhiệm,

- (BOOL)unknownPersonViewController:(ABUnknownPersonViewController *)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier 

Tôi thực sự muốn cảnh báo người dùng rằng họ, ví dụ: sẽ rời khỏi ứng dụng khi họ nhấp vào một địa chỉ, sẽ kích hoạt ứng dụng bản đồ. Tôi đã sử dụng MapKit để làm bản đồ của riêng mình, nhưng tôi không có đủ kiên nhẫn để tái tạo ứng dụng bản đồ đầy đủ (cho phép người dùng nhận chỉ đường từ một số địa chỉ khác) và phải sử dụng shouldPerformDefaultAction. ứng dụng bản đồ, nhưng tôi không có cách nào cảnh báo người dùng rằng họ đang rời khỏi ứng dụng.

Tôi thực sự muốn Apple sẽ cung cấp một mô hình UIAlertView rất cơ bản hơn là hack xung quanh nó. Điều này thật ngốc nghếch.

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