从xib中的自定义表格单元呈现视图控制器

时间:2014-04-07 05:21:01

标签: ios objective-c uitableview uiimagepickercontroller

我已经在单元格中创建了自定义tableView控制器,我已经放置了一个按钮来打开设备照片库。我的问题,我无法从CustomCell.m打开imagePickerController,它显示错误。 enter image description here

请提出一些解决问题的建议。

7 个答案:

答案 0 :(得分:29)

TableViewCell是一个视图,你不能在视图上present而是UIViewController可以处理它。您应该将控件从单元格传输到包含tableview的控制器,并为其创建自定义单元格。

试试这样:

自定义单元格.h类:

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

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

然后Synthesize it in。m。

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];
}

它是一个给你一个想法的伪代码。

修改

Swift等价物:

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

    };
}

答案 1 :(得分:11)

提出委托或实例变量的答案是正确的,但是,在大多数情况下,使用特殊视图控制器来呈现新控制器并不重要。 在这些情况下,以下解决方案要简单得多:只需使用应用程序根视图控制器:

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

答案 2 :(得分:1)

Viewcontroller有

presentViewController:消息。将控件从Cell委托给viewController并使用相同的行来解决您的问题。 UITableViewCell不响应presentViewController:消息。

答案 3 :(得分:1)

您需要UIViewController来呈现。你可以在这里做一些事情。一种方法是使用changePicturePressed回调方法创建自定义委托协议。然后,您可以将包含视图控制器指定为该委托,并在委托方法中执行演示。

您可以做的另一件事是在初始化期间将UIViewController传递到您的单元格并将其设置为弱属性。然后,您可以使用该属性直接从单元格内执行演示。

答案 4 :(得分:1)

制作按钮的IBOutlet

然后在cellForRowAtIndexPath给目标按钮

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

答案 5 :(得分:1)

One other way to do this is pass reference of the controller of the CustomCell to the CustomCell and use that to present the new controller.

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;
}

答案 6 :(得分:-1)

您需要viewcontroller来呈现视图。你不能在tableviewcells上呈现viewcontroller。