PresentViewController из пользовательского TableCell в Xib

Я создал собственный контроллер tableView, внутри ячейки я поместил кнопку, чтобы открыть библиотеку фотографий устройства. Моя проблема, я не могу открыть imagePickerController из CustomCell.m, как показано ниже, ошибка. введите описание изображения здесь

Пожалуйста, дайте некоторую идею, чтобы исправить мою проблему.

7 ответов

Решение

TableViewCell это представление, вы не можете present на представлениях вместо этого UIViewController может обработать это. Вы должны передать элемент управления из своей ячейки в ваш контроллер, который содержит табличное представление и создает для него настраиваемую ячейку.

Попробуйте вот так:

Custom Cell .h Учебный класс:

@protocol changePictureProtocol <NSObject>
-(void)loadNewScreen:(UIViewController *)controller;
@end

@property (nonatomic, retain) id<changePictureProtocol> delegate;

затем Synthesize it in.м.

Добавьте это в m файл:

-(IBAction)changePicture:(id)sender
{
    // ..... blah blah
    [self.delegate loadNewScreen:picker];
}

Viewcontroller, который загружает эту ячейку:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   // create cell here

   cell.delegate = self;
}

-(void)loadNewScreen:(UIViewController *)controller;
{
  [self presentViewController:controller animated:YES completion:nil];
}

Это psuedocode, чтобы дать вам идею.

РЕДАКТИРОВАТЬ:

Свифт эквивалент:

CustomTableViewCell.swift код:

protocol ChangePictureProtocol : NSObjectProtocol { 
    func loadNewScreen(controller: UIViewController) -> Void;  
}

class CustomTableViewCell: UITableViewCell {

    // Rest of the class stuff

    weak var delegate: ChangePictureProtocol?

    @IBAction func changePicture(sender: AnyObject)->Void
    {
        var pickerVC = UIImagePickerController();
        if((delegate?.respondsToSelector("loadNewScreen:")) != nil)
        {
           delegate?.loadNewScreen(pickerVC);
        }  
    }
}

ViewController.swift код:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
    var cell = tableView.dequeueReusableCellWithIdentifier("cellIdentifier") as CustomTableViewCell!

    cell.delegate = self;

    return cell;
}

func loadNewScreen(controller: UIViewController) {
    self.presentViewController(controller, animated: true) { () -> Void in

    };
}

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

UIViewController* activeVC = [UIApplication sharedApplication].keyWindow.rootViewController;
[activeVC presentViewController:'new view controller'
                       animated:YES
                     completion:NULL];

Сделайте IBOutlet своей кнопкой

Затем в cellForRowAtIndexPath дать цель кнопке

CustomCell *customCell=[tableView dequeueReusableCellWithIdentifier:@"CellIdentifier"];
[customCell.yourButton addTarget:self action:@selector(yourButtonAction:) forControlEvents:UIControlEventTouchUpInside];

presentViewController: сообщение для Viewcontroller. Передайте управление из Cell в viewController и используйте ту же строку, чтобы решить вашу проблему. UITableViewCell не отвечает на presentViewController: сообщение.

Еще один способ сделать это - передать ссылку на контроллер CustomCell в CustomCell и использовать ее для представления нового контроллера.

Swift:

CustomCell.swift:

class CustomTableViewCell: UITableViewCell {

    // Rest of the class stuff

    var parentViewController: UIViewController? = nil

    gotoNewControllerBtn.addTarget(self, action: #selector(gotoNewController), for: .touchUpInside)

    func gotoNewController() {
        let newViewController = NewViewController()
        parentViewController.present(newViewController, animated: true, completion: nil)
    }
}

ViewController.swift:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
    var cell = tableView.dequeueReusableCellWithIdentifier("cellIdentifier") as CustomTableViewCell!

    cell.parentViewController = self;

    return cell;
}

Тебе необходимо UIViewController представлять из. Есть несколько вещей, которые вы можете сделать здесь. Можно было бы создать собственный протокол делегата с changePicturePressed метод обратного вызова. Затем вы можете назначить содержащий контроллер представления в качестве этого делегата и выполнить представление в методе делегата.

Другая вещь, которую вы можете сделать, это передать UIViewController в вашу ячейку во время инициализации и установите его как слабое свойство. Затем вы можете выполнить презентацию прямо из ячейки, используя это свойство.

Вам нужен viewcontroller для представления вида. Вы не можете представить viewcontroller на tableviewcells.

Другие вопросы по тегам