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.