2009-07-22 61 views

Trả lời

-2

nút Thees là subviews của UIActionSheet và lớp học của họ là UIThreePartButton

Bạn có thể nhận được chúng và làm tất cả những gì bạn muốn:

UIActionSheet *a = [[UIActionSheet alloc]initWithTitle:@"" delegate: nil cancelButtonTitle: @"c" destructiveButtonTitle: @"d" otherButtonTitles: @"ot", nil]; 
    [a showInView: window]; 

    for(UIView *v in [a subviews]) 
    { 
     if([[v description] hasPrefix: @"<UIThreePartButton"]) 
     { 
      v.hidden = YES; //hide 
      //((UIButton*)v).enabled = NO; // disable 

     } 
    } 
+3

tôi sẽ đề nghị bạn không sử dụng phương pháp này vì đây là những tin tới SDK. Apple có thể từ chối ứng dụng của bạn. Thay thế tốt nhất là không hiển thị các nút này ở tất cả thay vì tắt chúng – lostInTransit

+0

Không có phương pháp riêng trong mã này)) Chỉ công khai :) Đôi khi tôi sử dụng các phương pháp riêng tư trong ứng dụng của mình. Tôi sử dụng chúng một lần hai lần trong ứng dụng và táo đã không từ chối các ứng dụng này – oxigen

+5

Nó không chỉ bị Apple từ chối, việc sử dụng API riêng cho thấy sự thiếu tôn trọng đối với khách hàng của bạn.API riêng tư là riêng tư vì Apple vẫn khóa chúng, vì vậy nếu và khi nào chúng thay đổi, ứng dụng của bạn sẽ bị hỏng. Xem traversal như bạn mô tả ở trên gây ra một số ứng dụng để phá vỡ dưới 3.0, rất nhiều để Apple gọi này ra trong các ghi chú phát hành và nói không làm điều này. –

0

Đây có lẽ là hơi muộn. Tuy nhiên, cách tôi đã tìm ra là tạo ra UIButton (s) và thêm chúng vào UIActionSheet subview. Hãy chắc chắn rằng các nút này được đặt ở trên cùng và hoàn toàn bao gồm (các) nút UIActionSheet mặc định để thay thế. Khi UIButton được đặt trên nút UIActionSheet mặc định, UIResponder của nó được ưu tiên hơn nút UIActionSheet UIResponder. Vì vậy, làm như vậy bạn có thể vô hiệu hóa và kích hoạt các nút tuy nhiên bạn muốn bất cứ nơi nào trong bạn UIViewController logic. Đây có thể là một cách thay thế để truy cập các phương thức riêng tư vào SDK (như trên - UIThreePartButton) và táo có thể từ chối ứng dụng của bạn. Tôi tin rằng điều này theo hướng dẫn của Apple.

ví dụ:

// Instantiate once 
if (self.actionSheet==nil) { 
    UIActionSheet *as = [[UIActionSheet alloc] 
         initWithTitle:@"" 
         delegate:self 
         cancelButtonTitle:@"Cancel" 
         destructiveButtonTitle:@"Load Data" 
         otherButtonTitles:@"Update Data",nil]; 

    //[actionSheet showInView:self.view]; 
    self.loadUIButton.frame = CGRectMake(24.0f,25.0f,275.f,46.0f); 
    [as addSubview: self.loadUIButton]; 
    self.updateUIButton.frame = CGRectMake(24.0f,78.0f,275.f,46.0f); 
    [as addSubview: self.updateUIButton]; 
    //[actionSheet addSubview: self.cancelUIButton]; 
    //[as showFromToolbar: self.navigationController.toolbar]; 
    self.actionSheet = as; 
    [as release]; 
} 
[self.actionSheet showFromToolbar: self.navigationController.toolbar]; 
17

Dựa trên một số chủ đề, tôi đã tổng hợp một câu trả lời vào một thể loại trên UIActionSheet, thêm một setButton: Phương pháp toState như sau. Hy vọng nó giúp:

@interface UIActionSheet(ButtonState) 
- (void)setButton:(NSInteger)buttonIndex toState:(BOOL)enbaled; 
@end 

@implementation UIActionSheet(ButtonState) 
- (void)setButton:(NSInteger)buttonIndex toState:(BOOL)enabled { 
    for (UIView* view in self.subviews) 
    { 
     if ([view isKindOfClass:[UIButton class]]) 
     { 
      if (buttonIndex == 0) { 
       if ([view respondsToSelector:@selector(setEnabled:)]) 
       { 
        UIButton* button = (UIButton*)view; 
        button.enabled = enabled; 
       } 
      } 
      buttonIndex--; 
     } 
    } 
} 
@end 
+0

Giải pháp tuyệt vời, rất đơn giản, dễ sử dụng và được thực hiện đúng cách kỹ thuật. +1 – Darrarski

2

cải thiện Hơi phiên bản của Reuven của [than ôi tôi không thể thêm một comment cho mình vì tôi không có 'danh tiếng' chưa ...].

@interface UIActionSheet (ButtonEnabled) 
- (void)setButtonAtIndex:(NSUInteger)index Enabled:(BOOL)enabled; 
@end 

@implementation UIActionSheet (ButtonEnabled) 
- (void)setButtonAtIndex:(NSUInteger)index Enabled:(BOOL)enabled 
{ 
    for (UIView* view in self.subviews) { 
     if ([view isKindOfClass:[UIButton class]]) { 
      if (index-- == 0) { 
       [(UIButton*)view setEnabled:enabled]; 
       break; 
      } 
     } 
    } 
} 
@end 

Các respondsToSelector trước: kiểm tra là không liên quan, bởi vì chúng tôi đã kiểm tra UIButton (mà là một lớp con UIControl, mà tất cả sự ủng hộ setEnabled] Để phù hợp với NSArrays của Apple, tôi cũng đổi thành "AtIndex" và NSUInteger. Tuy nhiên, xin lưu ý rằng phương pháp tiếp cận tổng thể dường như hoạt động tốt, nhưng xin lưu ý rằng nó cho rằng thứ tự các nút xem xét chính xác khớp với thứ tự của các nút chỉ mục khi bảng tác vụ được xây dựng, mà không phải là nghiêm chỉnh được ghi lại ở bất cứ nơi nào AFAIK.

+0

BTW, theo [this] (http://stackoverflow.com/questions/5262428/uiactionsheet-buttonindex-values-faulty-when-using-more-than-6-custom-buttons), chỉ mục nút * do * go haywire khi bạn có quá nhiều mục trong bảng tác vụ của bạn. Vì vậy, đó sẽ vít lên phương pháp này (để vô hiệu hóa) nếu bạn có nhiều. – tiritea

1

Các giải pháp được cung cấp không phải lo lắng k trên iOS 8. Trong trường hợp bất kỳ ai không sử dụng UIAlertController cho điều này (đây là cách tôi khuyên dùng của Apple), đây là cách tôi sửa đổi câu trả lời của @ Reuven để làm việc cho iOS 8:

(giai đoạn thứ hai là dựa trên trên this để trả lời)

- (void)setButton:(NSInteger)buttonIndex toState:(BOOL)enabled { 

    SEL selector = NSSelectorFromString(@"_alertController"); 

    //iOS 8 
    if ([self respondsToSelector:selector]) { 

     UIAlertController *alertController = [self valueForKey:@"_alertController"]; 

     if ([alertController isKindOfClass:[UIAlertController class]]){ 

      UIAlertAction *action = alertController.actions[buttonIndex]; 

      [action setEnabled:enabled]; 

     } 

    //iOS 7 
    }else{ 

     for (UIView* view in self.subviews){ 

      if ([view isMemberOfClass:NSClassFromString(@"UIAlertButton")]) { 

       if (buttonIndex == 0) { 

        if ([view respondsToSelector:@selector(setEnabled:)]){ 

         UIButton* button = (UIButton*)view; 

         button.enabled = enabled; 

        } 

       } 

       buttonIndex--; 

      } 

     } 

    } 

} 
1

Swift 3.0 phiên bản:

let actionSheet = UIAlertController(title:nil, message:nil, preferredStyle:UIAlertControllerStyle.actionSheet) 


actionSheet.addAction(UIAlertAction(title:"Modify", style:UIAlertActionStyle.default, handler:{ action in 
    // Do your thing here 
})) 

let disabledDelete = UIAlertAction(title:"Cannot delete this item", style:UIAlertActionStyle.destructive, handler:nil) 
disabledDelete.isEnabled = false 
actionSheet.addAction(disabledDelete) 

actionSheet.addAction(UIAlertAction(title:"Cancel", style:UIAlertActionStyle.cancel, handler:nil)) 

self.present(actionSheet, animated:true, completion:nil) 
Các vấn đề liên quan