Как отобразить всплывающее окно с кнопки в пользовательской ячейке таблицы?

Я разрабатываю приложение, в котором пользователь может вводить продукты и информацию об этих продуктах. Вся информация о продуктах вводится в пользовательскую ячейку UITableViewCell. Я также хочу разрешить пользователю добавлять изображения продуктов. Для этого мне нужно показать всплывающее окно, содержащее UIImagePickerController. когда я это делаю, Xcode дает мне эту ошибку:

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

Когда пользователь нажимает кнопку, чтобы добавить изображение (называемое addImage), моя пользовательская ячейка запускает это действие внутри моего TableView:

- (void) addImage
{
    CustomCell *customcell = [[CustomCell alloc] init];

    itemImagePicker = [[UIImagePickerController alloc] init];
    itemImagePicker.delegate = self;
    itemImagePicker.sourceType= UIImagePickerControllerSourceTypePhotoLibrary;

    itemImagePopover = [[UIPopoverController alloc] initWithContentViewController:itemImagePicker];
    [itemImagePopover presentPopoverFromRect:customCell.addImage.bounds inView:self.tableView permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

}

моя ячейкаForRowAtIndexPath выглядит так:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CustomCellIdentifier = @"CustomCellIdentifier ";
    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier: CustomCellIdentifier];
    if (cell == nil) {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell"
                                                     owner:self options:nil];
        for (id oneObject in nib) if ([oneObject isKindOfClass:[CustomCell class]])
            cell = (CustomCell *)oneObject;
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }
    NSUInteger *row = [indexPath row];
    Model *model = self.products[indexPath.row];

    cell.itemName.text = model.itemName;
    cell.itemDescription.text = model.itemDescription;
    cell.itemPrice.text = model.itemPrice;

    cell.itemPrice.delegate = self;
    cell.itemName.delegate = self;
    cell.itemDescription.delegate = self;

    NSLog(@"%@", cell.itemPrice);

    return cell;
}

(«модель» — это настраиваемый класс. Каждый экземпляр этого класса представляет один продукт. Каждый раз, когда пользователь добавляет строку в табличное представление, один экземпляр этого класса добавляется в массив.)

Я искал SO и google весь день, и я не нашел никакого решения о том, как это работает с пользовательской ячейкой, только о том, как это работает в didSelectRowAtIndexPath и при нажатии кнопки раскрытия.

Итак, мой вопрос краток: как правильно отобразить всплывающее окно при нажатии кнопки внутри пользовательской ячейки?

Заранее спасибо, любая помощь будет очень признательна.


person Joris416    schedule 25.06.2013    source источник


Ответы (1)


Вы создаете новый экземпляр CustomCell в этом методе. Этот экземпляр нигде не отображается на экране. Вам нужно найти экземпляр CustomCell, который представляет строку, из которой вы хотите показать всплывающее окно. Если эта строка статическая и всегда будет одинаковой, вы можете сделать что-то вроде этого:

// change the row and section variables below to the values that correspond to the section and row from which you want to display the popover
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:section]; 
CustomCell *customCell = [self.tableView cellForRowAtIndexPath:indexPath];

Если вы заранее не знаете путь к индексу, передайте его в качестве параметра в addImage:.

ИЗМЕНИТЬ

Из вашего обновленного вопроса видно, что вы путаете разные части MVC. Можно добавить кнопку в пользовательскую ячейку, но в целях повторного использования вы не должны обрабатывать нажатия оттуда. Это то, что должен делать ваш контроллер представления. Как контроллер представления узнает, когда нажата кнопка? Делегирование.

person Scott Berrevoets    schedule 25.06.2013
comment
<#ряд>? <#раздел>? какие именно эти двое? Я никогда не видел их раньше (я новичок). Боюсь, это не работает, это дает мне ожидаемую ошибку выражения для этой строки кода/ - person Joris416; 25.06.2013
comment
Вам нужно заполнить значения для строки и раздела, которые соответствуют ячейке, из которой вы хотите показать всплывающее окно. Я отредактирую для ясности. - person Scott Berrevoets; 25.06.2013
comment
ах это проясняет. можете ли вы объяснить мне, как передать indexpath в качестве параметра этому методу? - person Joris416; 25.06.2013
comment
Измените метод на - addImage:(NSIndexPath *)indexPath, и при его вызове передайте правильный путь индекса. Если вы все еще не знаете, как это сделать, обновите свой вопрос, указав, откуда вы вызываете addImage и как выглядит ваше табличное представление. - person Scott Berrevoets; 25.06.2013
comment
я никогда не делал этого раньше. Я обновлю свой вопрос с помощью файла cellForRowAtIndexPath. addImage вызывается моим CustomClass. - person Joris416; 25.06.2013
comment
хорошо, я позабочусь о том, чтобы мой tableviewcontroller справился с касанием. но если я это сделаю, мне все равно нужно знать, в какой строке он был затронут, верно? как должен выглядеть мой метод, когда tableViewController обрабатывает касание этой кнопки? - person Joris416; 25.06.2013
comment
давайте продолжим это обсуждение в чате - person Scott Berrevoets; 25.06.2013
comment
Позвольте мне подытожить: вы не можете поместить всплывающее окно в cellforrowatindexpath, потому что вы не можете открыть всплывающее окно для каждой строки в табличном представлении. Вам нужно поместить код в didSelectRowAtIndexPath:(NSIndexPath *)indexPath. В вызове метода CustomCell *customCell = [self.tableView cellForRowAtIndexPath:indexPath]; затем передайте его в addImage следующим образом: -(void) addImage:(CustomCell *) cell …. в вашем всплывающем окне измените параметр inView: на inView:cell.view и убедитесь, что параметр fromRect находится в пределах ячейки. - person Paulo; 24.09.2013