Nút hủy UIActionSheet có hành vi lạ


116

Tôi có một UIBarButtonItem đang mở một trang hành động để cung cấp cho người dùng các lựa chọn về việc cần làm. Mọi thứ hoạt động như mong đợi trừ khi tôi cố gắng nhấp vào nút "Hủy". Mục tiêu của nút dường như đã di chuyển lên từ vị trí của nó. Tôi chỉ có thể kích hoạt nó bằng cách nhấp vào đâu đó ở giữa các nút "Hủy" và "Ok".

Tôi đã thử các bảng thao tác trong các ứng dụng khác và chúng hoạt động tốt, vì vậy nó không chỉ là ngón tay cái lớn của tôi. Trang hành động đang mở trong UIViewController

- (void)showOpenOptions
{
    UIActionSheet *sheet = [[UIActionSheet alloc] 
    initWithTitle:NSLocalizedString(@"Open link in external application?", @"Open in external application")
    delegate:self
    cancelButtonTitle:NSLocalizedString(@"Cancel", @"Cancel")
    destructiveButtonTitle:NSLocalizedString(@"Open Link", @"Open Link")
    otherButtonTitles:nil];

    [sheet showInView:self.view];
    [sheet release];
}

5
Trên một lưu ý không liên quan, tôi đã được nói tại WWDC trong một buổi đánh giá giao diện người dùng Apple rằng nút màu đỏ trên Trang tính hành động thực sự dành cho các hành động 'phá hoại' (tức là 'xóa').
Ramin

Vâng, tôi đã đọc hướng dẫn về giao diện con người gần đây và thấy điều đó. Đã thay đổi nó từ màu đỏ sang màu xám.
nevan king, 30/07/09

Câu trả lời:


190

Thay vì chuyển chế độ xem của bộ điều khiển chế độ xem hiện tại sang trang tính hành động, hãy sử dụng showFromTabBar:phương thức UIActionSheet.

Cách phù hợp
Điều này sẽ cung cấp khu vực có thể chạm chính xác:

[actionSheet showFromTabBar:self.tabBarController.tabBar];

Cách sai
Điều này sẽ đặt vùng có thể nhấn vào sai vị trí (nếu bạn đang sử dụng thanh tab hoặc thanh công cụ):

[actionSheet showInView:self.view];

Nếu bạn đang sử dụng thanh công cụ , hãy sử dụng showFromToolbar:phương pháp thay thế. Bạn sẽ cần tham chiếu đến thanh công cụ, rất có thể là một ivar

[actionSheet showFromToolbar:self.myToolbar];

Câu trả lời cũ của tôi cũng hoạt động, nhưng là hacky:

Chỉ cần tìm thấy một câu trả lời khả thi:

01-12-2008 10:22 PM Tom Saxton: Tôi đã xem xét thêm một số lỗi này, và nó có vẻ là một vấn đề với thanh tab.

Nếu bạn gọi [sheet showInView: self.view] của UIActionSheet từ bộ điều khiển chế độ xem là con của UITabViewController, thì thử nghiệm lần truy cập trên nút hủy không thành công trong phần đó của UIActionSheet nằm phía trên chế độ xem của thanh tab.

Thay vào đó, nếu bạn chuyển vào dạng xem của UITabBarController, thì UIActionSheet sẽ hoạt động như mong đợi.

LƯU Ý: trong iPhone OS 2.1 trở về trước, UIActionSheet xuất hiện từ đầu thanh tab khi bạn chuyển chế độ xem con, nhưng trong 2.2, nó xuất hiện từ cuối thanh tab và do đó bao phủ chế độ xem tab.

http://openradar.appspot.com/6410780

Chỉnh sửa: Nó hoạt động chính xác khi tôi thay đổi chế độ xem thành chế độ xem của thanh tab

[sheet showInView:self.parentViewController.tabBarController.view];

Đã ủng hộ cái này vì nó hoạt động. Tại sao điều này tốt hơn các câu trả lời khác?
bentford

1
Tại sao lại sử dụng parentViewController? Ngay cả khi chế độ xem nằm trong tab Chế độ xem điều hướng, BarController vẫn phải trỏ đến đúng nơi. Hoạt động cho tôi mà không cần đến parentViewController trong mọi trường hợp.
Nathan

11
Một câu trả lời khác có vẻ tốt hơn. Tìm kiếm [actionSheet showInView: [self.view window]]. Có vẻ thẳng thắn hơn và chung chung hơn.
Kevin

Cảm ơn bạn rất nhiều vì đã đăng câu trả lời này.
fulvio

1
Tôi không có thanh tab trong ứng dụng của mình nhưng vẫn gặp sự cố như vậy. Tôi đã giải quyết nó bằng '[serf.view window]'. Nó không phải là vấn đề thanh tab dù sao.
Mike Keskinov

37

Tôi đã tìm thấy một câu trả lời ở đây có hiệu quả.

sử dụng [filterActionSheet showInView:[self.view window]]:;

Tôi đã thử một số cách để truy cập thanh tab của mình và cách ứng dụng này được thiết lập có vẻ phức tạp ...


HOÀN HẢO! Cảm ơn. Đây là giải pháp chính xác cho tôi, vì tôi đã gặp vấn đề này với UITableViewController có thanh công cụ không phải TabBar như những người khác ở đây.
William Denniss

công cụ tốt, điều này làm việc cho tôi! đây chắc chắn là cách dễ nhất để làm điều đó!
cgossain

2
Nó gây ra một vấn đề khác. ActionSheet xuất hiện theo hướng dọc khi thiết bị ở chế độ ngang (cũng như tất cả các nội dung khác).
Mike Keskinov

22

Thay vào đó hãy sử dụng:

[sheet showFromTabBar:theTabBar];

1
Tôi đã sửa điều này từ showInTabBar:thành showFromTabBar:. Cũng lưu ý rằng có một phương thức 'showFromToolbar:', tùy thuộc vào nội thất màn hình bạn có ở cuối màn hình. Đây, tôi nghĩ, là một câu trả lời tốt hơn câu trả lời được chấp nhận.
Stephen Darlington

Stephen, tò mò tại sao bạn nghĩ điều này tốt hơn là chỉ định showInView: theTabBar? Từ góc độ khớp nối, tôi nghĩ rằng showInView có lẽ sẽ lý tưởng hơn, trong trường hợp sau này tabBar bị bỏ, có thể được thay thế bằng thanh công cụ chẳng hạn. Tôi nghĩ rằng bộ điều khiển chế độ xem phụ cụ thể không thực sự phải biết hoặc quan tâm.
Billy Grey

Nếu thanh tab bị bỏ sau đó, bạn sẽ phải chỉnh sửa dòng mã đó bất kể (trừ khi có lẽ theTabBar là một tham chiếu được đặt tên kém cho một chế độ xem được chuyển vào). Vì vậy, tôi không thấy phương thức này được kết hợp như thế nào với showInView: theTabBar. Tôi cũng sử dụng showFromTabBar, vì nó có vẻ an toàn hơn đối với tôi. Tôi không biết điều gì đang xảy ra dưới vỏ bọc, nhưng tôi tưởng tượng rằng showFromTabBar: ít có khả năng bị hỏng trong các bản phát hành hệ điều hành trong tương lai hơn showFromView: với chế độ xem thanh tab.
Christopher Pickslay

10

Đây là bản sửa lỗi. Hãy thử điều này:

[actionsheet showInView:[UIApplication sharedApplication].keyWindow];

5

Tôi nghĩ rằng sự kết hợp của ba trong số các câu trả lời là cách đúng đắn để xử lý vấn đề này:

    [actionSheet showFromTabBar:self.tabBarController.tabBar];

tức là, sử dụng showFromTabBar (đó là lý do tại sao nó tồn tại) và bạn không cần đến parentViewController như Nathan đã chỉ ra (trên thực tế, self.parentViewController.tabBarController.tabBar trả về nil cho tôi.


Tất nhiên, nó trả về nil, vì bộ điều khiển chế độ xem cha (là UITabBarViewController) không tự lồng vào một UITabBarController khác, vì vậy thuộc tính tabBarController của nó là nil.
Dominik Seibold

1

FYI - gặp vấn đề tương tự với biểu tính của UIDocumentInteractionController khi bước trên thanh tab. Sử dụng phần sau để sửa chữa.

UIViewController *parentView = [[self parentViewController] parentViewController];
[docController presentOptionsMenuFromRect: rect inView: parentView.view animated:YES];

-2

viết mã simplite

 actionSheet.actionSheetStyle = UIActionSheetStyleDefault;

công việc này ổn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.