2011-12-26 35 views
7

Tôi đang gặp phải một thời gian khủng khiếp khi nhận được UIAlertView để hoạt động trong lớp NSObject tùy chỉnh của mình. Trong nghiên cứu tôi đã làm nó xuất hiện nó sẽ là có thể nhưng đây là những gì tôi đã chạy vào.Sử dụng UIAlertView trong NSObject

Thứ nhất, đây là mã của tôi:

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 
    NSLog(@"clickedButtonAtIndex: %d", buttonIndex); 
} 

-(void)testAlertView { 
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"List Contains Items" 
        message:@"List contains items. Remove all items & delete?" 
        delegate:self 
        cancelButtonTitle:@"No" 
        otherButtonTitles:@"Yes", nil]; 
    [alertView show]; 
} 

Nếu tôi đặt các đại biểu để tự mã này bị treo ngay sau khi tôi gõ một nút. Nếu tôi đặt nó thành nil clickButtonAtIndex thì không bao giờ được gọi. Tôi đã thử với và không sử dụng <UIAlertViewDelegate>.

Tôi biết ai đó sẽ hỏi 'tại sao bạn làm điều này trong NSObject thay vì trong UIViewController?'. Chủ yếu là vì tôi muốn tách mã này ra để tôi có thể sử dụng nó từ nhiều nơi trong ứng dụng của mình. Nhưng cũng bởi vì đây là một phần nhỏ của một khối logic lớn hơn có ý nghĩa để trở thành của riêng nó.

Bất kỳ ý tưởng nào tôi đang làm sai?

Cảm ơn, Giàu

+0

Mã này * nên * làm việc, thực sự. Khi đại biểu được đặt và cảnh báo gặp sự cố, chính xác thì sự cố xảy ra ở đâu và có dấu vết ngăn xếp không? –

+1

Đối tượng của bạn đã được deallocated bởi thời gian bạn chạm vào nút? (Các đối tượng thường không giữ lại các đại biểu của họ) –

+0

Đây chỉ là điển hình. Tôi đã dành hàng giờ nhìn chằm chằm vào điều này và nghiên cứu và cố gắng một điều khác không thành công, vì vậy tôi quyết định yêu cầu giúp đỡ. Không quá một giờ sau, tôi cuối cùng đã tìm ra. Nó phải liên quan đến cách tôi tạo đối tượng tùy chỉnh trong bộ điều khiển chế độ xem cuộc gọi, vì vậy nó đã được giải phóng vào lúc tôi nhấn nút, giống như Frederick đề xuất. Cảm ơn các bậc tiền bối! – rdfrahm

Trả lời

8

tôi đã cùng một vấn đề sử dụng ARC. Gốc của vấn đề là như nhau. Tôi đã giải quyết nó bằng cách đặt NSObject tùy chỉnh của tôi thành thuộc tính "mạnh" để đảm bảo đối tượng tồn tại miễn là đối tượng gọi (một UIVIewCOntroller trong trường hợp của tôi) tồn tại, vì vậy khi đại biểu của chế độ xem cảnh báo của tôi được gọi là tôi vẫn có tùy chỉnh của mình đối tượng xung quanh và phương thức ủy nhiệm hoạt động tốt.

+0

Bạn có thể vừa mới cứu tôi vài giờ hôm nay! – ebi

1

Thêm NSObject là tài sản mạnh mẽ:

#import "Logout.h" // is NSObject 
. 
. 
. 
@property (nonatomic, strong) Logout *logout; 

Sau đó, bạn sẽ nhận được delegatemethods gọi NSObject của bạn.

Đừng quên đăng ký đại biểu cho UIAlertView:

@interface Logout() <UIAlertViewDelegate> 

và trong phương pháp của bạn:

UIAlertView *a = [[UIAlertView alloc] initWithTitle:@"title" 
message:@"message" delegate:self cancelButtonTitle:@"cancel" 
otherButtonTitles:@"ok", nil];    

[a show]; 
0

Làm thế nào để trình bày một báo Xem Sử dụng UIAlertController When You Do not Have A Xem bộ điều khiển. Detail description.

Có, bạn chỉ có thể sử dụng UIAlertController chỉ trong các lớp UIViewController. Vậy làm thế nào chúng ta có thể làm điều đó trong các lớp NSObject. Nếu bạn thấy liên kết mô tả ở trên, bạn sẽ nhận được câu trả lời. Để tóm tắt trong một dòng cho mô tả ở trên: Tạo một cửa sổ mới phía trên cửa sổ hiện tại. Cửa sổ mới này sẽ là viewController của chúng tôi, nơi chúng tôi hiển thị cảnh báo. Vì vậy, bằng cách sử dụng viewController này, bạn có thể gọi phương thức [presentViewController: animated: completion:].

Trả lời:

dispatch_async(dispatch_get_main_queue(), ^{ 

        UIWindow* window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 

        window.rootViewController = [UIViewController new]; 
        window.windowLevel = UIWindowLevelAlert + 1; 
        NSString *[email protected]“Your mssg"; 
        UIAlertController* alertCtrl = [UIAlertController alertControllerWithTitle:@“Title" message:msg preferredStyle:UIAlertControllerStyleAlert]; 

        [alertCtrl addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"Yes",@"Generic confirm") style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) { 

         // do your stuff 
         // very important to hide the window afterwards.      
         window.hidden = YES; 

        }]]; 

        UIAlertAction *cancelAction= [UIAlertAction actionWithTitle:@"cancel" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { 

         window.hidden = YES; 

        }]; 

        [alertCtrl addAction:cancelAction]; 

       //http://stackoverflow.com/questions/25260290/makekeywindow-vs-makekeyandvisible 

        [window makeKeyAndVisible]; //The makeKeyAndVisible message makes a window key, and moves it to be in front of any other windows on its level 
        [window.rootViewController presentViewController:alertCtrl animated:YES completion:nil]; 

       });