2011-11-24 34 views
10

Tôi muốn loại bỏ UIAlertView ở bất kỳ nơi nào bên ngoài nó bằng một lần nhấn. Tôi muốn hiển thị một UIAlertView mà không cần bất kỳ nút nào.iOS Làm cách nào để loại bỏ UIAlertView bằng một lần nhấn ở bất kỳ đâu?

Tôi có mã UIAlertView chuẩn ở đây, nhưng tôi cần đầu vào cách loại bỏ mã này, nếu có thể.

Với UITouch? Với UITapGestureRecognizer?

Cảm ơn bạn.


EDIT:

trong viewDidLoad

alertview khởi ở đây với tên "cảnh báo"

 if (alert) 
    { 
    emptyview = [[UIView alloc]initWithFrame:CGRectMake(0,0,320,480)]; 
    emptyview.backgroundColor = [UIColor clearColor]; 
    [self.view addSubview:emptyview]; 
     [emptyview addSubview:alert]; 
    NSLog (@"emptyview is there!"); 

     UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)]; 
     [emptyview addGestureRecognizer:singleTap]; 
     [singleTap release];    
    } 

Nhưng emptyview doesnt này không đáp ứng ở tất cả và nó không đáp ứng với handleSingleTap selector , mà tôi đã viết lại một chút:

-(void)handleSingleTap:(UITapGestureRecognizer *)sender{ 
    [alert dismissWithClickedButtonIndex:0 animated:YES]; 
    [emptyview removeFromSuperview]; 
} 

Tôi cần chế độ xem trống này được thông báo khi cảnh báo được hiển thị sau đó tôi có thể loại bỏ cảnh báo bằng một lần chạm.

tôi đã cố gắng:

 if (alert) 
    { 
    emptyview = [[UIView alloc]initWithFrame:CGRectMake(0,0,320,480)]; 
    emptyview.backgroundColor = [UIColor clearColor]; 
    [self.view addSubview:emptyview]; 
     [emptyview addSubview:alert]; 
    NSLog (@"emptyview is there!"); 

     UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)]; 
     [alert addGestureRecognizer:singleTap]; 
     [singleTap release];    
    } 

Tất nhiên, cảnh báo đã đáp ứng với chức năng handleSingleTap. Tôi đã làm gì sai với emptyview?


THỨ HAI EDIT:

Những gì tôi muốn đạt được trong trường hợp này là để cho thấy một cái nhìn nhỏ với lời giải thích sau khi chọn một từ, chức năng tương tự trong ứng dụng Kindle, nếu bạn có một. Có lẽ tôi nên tạo UIView thay vì UIAlertView? Nhưng cái nhìn nhỏ trong ứng dụng Kindle rất đẹp với bóng bên dưới nó, làm thế nào là nó có thể?

Trả lời

10

Nghe có vẻ như bạn là chủ yếu cố gắng để tái tạo một "Toast" trên iOS. Tin tốt, ai đó đã làm điều đó. See this project.

Chỉnh sửa: Không muốn sử dụng iToast. Tôi thích phong cách của bạn, ít mã hơn. Đây là những gì tôi nghĩ ra. Nó có vẻ hiển nhiên như những người khác đã nói rằng cách duy nhất để khắc phục bản chất của phương thức UIAlertView là thêm một người giám sát để xử lý các sự kiện liên lạc. Nhưng bạn không phải làm điều đó theo cách thủ công mọi lúc, hãy xem xét phân lớp UIAlertView. Hãy thử một cái gì đó như thế này:

Chỉnh sửa: @wagashi, Cảm ơn bạn đã chấp nhận câu trả lời của tôi và cảm ơn người đứng đầu về điều chỉnh kích thước.Mã của bạn thực hiện một cảnh báo rất giống như bánh mì nướng, tuy nhiên khi tôi thử nó, tôi thấy rằng nếu thông điệp là dài xem dường như sụp đổ. Vì vậy, tôi đã sửa đổi setFrame: để chỉ đơn giản là giảm kích thước của cảnh báo bằng kích thước của một nút và duy trì ở giữa trên màn hình. Vì vậy, lớp học trả lời chính xác tiêu đề câu hỏi "iOS Làm cách nào để loại bỏ UIAlertView bằng một lần nhấn ở bất kỳ đâu?"

NoButtonAlertView.h

#import <UIKit/UIKit.h> 
@interface _NoButtonAlertViewCover : UIView 
@property (nonatomic,assign) UIAlertView *delegate; 
@end 
@interface NoButtonAlertView : UIAlertView 
-(id)initWithTitle:(NSString *)title message:(NSString *)message; 
@end 

NoButtonAlertView.m

#import "NoButtonAlertView.h" 
@implementation _NoButtonAlertViewCover 
@synthesize delegate = _delegate; 
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ 
    [self removeFromSuperview]; 
    [_delegate dismissWithClickedButtonIndex:0 animated:YES]; 
} 
@end 
@implementation NoButtonAlertView 
-(void)show{ 
    [super show]; 
    _NoButtonAlertViewCover *cover = [[_NoButtonAlertViewCover alloc] initWithFrame:[UIScreen mainScreen].bounds]; 
    cover.userInteractionEnabled = YES; 
    cover.backgroundColor = [[UIColor lightGrayColor] colorWithAlphaComponent:.01]; 
    cover.delegate = self; 
    [self.superview addSubview:cover]; 
} 
-(id)initWithTitle:(NSString *)title message:(NSString *)message{ 
    if ((self = [super initWithTitle:title message:message delegate:nil cancelButtonTitle:nil otherButtonTitles:nil, nil])){ 
    } 
    return self; 
} 
- (void)setFrame:(CGRect)rect { 
    // Called multiple times, 4 of those times count, so to reduce height by 40 
    rect.size.height -= 10; 
    self.center = self.superview.center; 
    [super setFrame:rect]; 
} 
@end 

Với UIAlertView lớp đơn giản này và UIView lớp con của nó cho một trang bìa, bạn có thể sử dụng nó một cách đơn giản như bạn sẽ một tiêu chuẩn UIAlertView. Cũng giống như vậy:

NoButtonAlertView *alert = [[NoButtonAlertView alloc] initWithTitle:@"Hello" message:@"I am the very model of a modern major general; I'm information, vegitable, animal, and mineral."]; 
[alert show]; 

sẽ mang lại:

Custom AlertView

+1

Um, mục tiêu của tôi không phải là tạo ra hoặc sử dụng chế độ xem làm từ các mã phức tạp và dài. IToast này thực sự tuyệt vời, nhưng tôi tự hỏi liệu có thể tạo ra một tính năng như vậy với ít mã hơn không? Cảm ơn bạn đã chia sẻ liên kết này với chúng tôi. – wagashi

+0

điều này vô cùng hữu ích! Tôi đã thêm vào .m: ' - (void) setFrame: (CGRect) rect { \t // [super setFrame: CGRectMake (0, 0, rect.size.width, 300)]; \t \t [super setFrame: CGRectMake (0, 0, 100, 100)]; \t \t // mã bên dưới làm cho UIAlertView được căn giữa. \t //self.center = CGPointMake (320/2, 480/2); \t \t // tùy chỉnh của tôi cgpointmake \t self.center = CGPointMake (200, 400); } ' – wagashi

+0

Có, bạn đã trả lời câu hỏi của tôi. Tuy nhiên tôi sẽ không đặt nhiều thông tin trong "cảnh báo" của tôi, vì vậy CGRectMake 0,0,100,100 chỉ là hoàn hảo trong trường hợp của tôi. Tôi tự hỏi liệu có thể thay đổi cỡ chữ của văn bản bên trong UIAlertView không? – wagashi

3

Sau khi hiển thị UIAlertView thêm vào bộ điều khiển xem của bạn (hoặc thậm chí cửa sổ) UIView trống mới có kích thước màn hình đầy đủ. Đính kèm để wiew này UITapGestureRecognizer

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)]; 
[view addGestureRecognizer:singleTap]; 
[singleTap release]; 

Bây giờ trong handleSingleTap phương pháp bạn có thể bỏ UIAlertView và loại bỏ quan điểm này từ cửa sổ

-(void)handleSingleTap:(UITapGestureRecognizer *)sender{ 
    [myAlert dismissWithClickedButtonIndex:0 animated:YES]; 
    [view removeFromSuperView]; 
} 
+1

tôi muốn thêm một UIButton tùy chỉnh không có văn bản hoặc hình ảnh –

+0

Vâng, ý tưởng tốt. Nó tiết kiệm từ viết một số dòng mã. Trong mọi trường hợp, bạn cần xử lý thao tác nhấn. – beryllium

+1

Vì tò mò, tại sao lại sử dụng 'UIAlertView'? Đặt toàn màn hình 'UIButton' ở phía trước của tất cả các chế độ xem khác với bất kỳ văn bản và màu nền nào bạn thích (hoặc nhận được fancier). – XJones

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