Tôi cần tắt các nút trong UIActionSheet. sau khi một số hoạt động tôi cần phải kích hoạt chúng một lần nữa. Vì vậy, có một cách để làm điều này.Làm thế nào để vô hiệu hóa nút trong UIActionSheet?
Cảm ơn
Tôi cần tắt các nút trong UIActionSheet. sau khi một số hoạt động tôi cần phải kích hoạt chúng một lần nữa. Vì vậy, có một cách để làm điều này.Làm thế nào để vô hiệu hóa nút trong UIActionSheet?
Cảm ơn
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
}
}
Đâ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];
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
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
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.
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
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--;
}
}
}
}
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)
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
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
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. –