Как показать лист действий внутри поповера? - PullRequest
7 голосов
/ 17 мая 2010

У меня есть контроллер разделенного представления, в котором на левой стороне находится контроллер табличного представления. Как показать лист действий внутри всплывающего окна, когда я нажимаю кнопку раскрытия сведений в ячейке таблицы?

Ответы [ 2 ]

15 голосов
/ 18 октября 2010

Попробуйте это:

UIActionSheet *popupSheet = [[UIActionSheet alloc] initWithTitle:@"Title" 
                                                        delegate:self 
                                               cancelButtonTitle:@"Cancel" 
                                          destructiveButtonTitle:@"No Way !" 
                                               otherButtonTitles:nil];

popupSheet.actionSheetStyle = UIActionSheetStyleBlackOpaque;
UIButton * disclosureButton = (UIButton *)cell.accessoryView;

[popupSheet showFromRect:disclosureButton.bounds inView:cell.accessoryView animated:YES];
[popupSheet release];

Документы UIActionSheet указывают, что метод showFromRect:inView:animated::

отображает лист действий в всплывающем окне, стрелка которого указывает на указанный прямоугольник вида (в нашем случае кнопка раскрытия сведений). Всплывающее окно не перекрывает указанный прямоугольник.

0 голосов
/ 19 июня 2012

Я использую это для более расширенного использования:

  1. находит пользовательский accesoryView (cell.accesoryView)
  2. если пусто, найти сгенерированный accesoryView (UIButton), если ячейка имеет
  3. если UIButton не существует, найти представление контекста ячейки (UITableViewCellContentView)
  4. если представление контекста ячейки не существует, используйте представление ячейки

Может использоваться для UIActionSheet или UIPopoverController .

Вот мой код:

UIView *accessoryView       = cell.accessoryView; // finds custom accesoryView (cell.accesoryView)
if (accessoryView == nil) {
    UIView *cellContentView = nil;

    for (UIView *accView in [cell subviews]) {
        if ([accView isKindOfClass:[UIButton class]]) {
            accessoryView   = accView; // find generated accesoryView (UIButton) 
            break;
        } else if ([accView isKindOfClass:NSClassFromString(@"UITableViewCellContentView")]) {
            // find generated UITableViewCellContentView                
            cellContentView = accView; 
        }
    }
    // if the UIButton doesn't exists, find cell contet view (UITableViewCellContentView)           
    if (accessoryView == nil) { 
        accessoryView   = cellContentView; 
    }
    // if the cell contet view doesn't exists, use cell view
    if (accessoryView == nil) {
        accessoryView   = cell; 
    }
}

[actionSheet showFromRect:**accessoryView.bounds** inView:**accessoryView** animated:YES];

Протестировано в iOS 4.3 до 5.1

Лучше всего использовать в качестве пользовательского метода:

-(UIView*)getViewForSheetAndPopUp:(UITableViewCell*)cell;

И код метода:

-(UIView*)getViewForSheetAndPopUp:(UITableViewCell*)cell {
UIView *accessoryView = cell.accessoryView;

if (accessoryView == nil) {
    UIView *cellContentView = nil;

    for (UIView *accView in [cell subviews]) {
        if ([accView isKindOfClass:[UIButton class]]) {
            accessoryView = accView;
            break;
        } else if ([accView isKindOfClass:NSClassFromString(@"UITableViewCellContentView")]) {              
            cellContentView = accView;
        }
    }       

    if (accessoryView == nil) {
        accessoryView   = cellContentView;
    }
    if (accessoryView == nil) {
        accessoryView   = cell;
    }
}

return accessoryView;
}
...