iOS如何呈现Uiview的Modal ViewController

时间:2014-10-14 16:52:55

标签: ios uiview

我有一个UIView的子类,现在我需要显示一个视图控制器,但是UIView没有显示视图控制器的方法。 这是我的问题 感谢的

这是我的uiview子类

中的一段代码
-(void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    if ([tabella isEqualToString:@"Articoli"]) {
        NSDictionary *itm=(NSDictionary*)[comanda objectAtIndex:indexPath.row];

        Articoli *aboutViewController = [[Articoli alloc] initWithNibName:@"Articoli" bundle:nil];

        aboutViewController.modalPresentationStyle = UIModalPresentationFormSheet;
        aboutViewController.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
        aboutViewController.idarticolo=[itm objectForKey:@"idarticolo"];
        CGRect aboutSheetFrame = aboutViewController.view.frame;

        UIViewController *viewController = [UIViewController new];
        viewController.view = self;

        //here xcode give me a red error
        [self presentViewController:viewController animated:YES completion:nil] ;

        aboutSheetFrame =CGRectZero;
        aboutViewController.view.superview.bounds = aboutSheetFrame;

    }
}

5 个答案:

答案 0 :(得分:4)

当您需要UIView实例与UIViewController之间的通信时,您应该遵循一些已知的iOS概念。您已经发现UIView无法真正呈现新的控制器(缺少presetViewController:animated:completion方法或navigationController属性,这两种方法都存在于UIViewController中)。

视图应该是代码中最可重用的部分,因此您必须考虑一种设计视图的方法,使其完全无视它们所处的位置。他们通常只了解用户互动。

首先,您必须做的是重构您的观点。

  1. 如果UIView应该是UIControl(具有某种目标选择器),则需要在控制器中使用添加目标以从视图交互中获取回调。
  2. 您可以使用UITableViewUICollectionView中使用的委托模式,该模式是作为协议设计的。
  3. 您可以使用添加到视图中的手势识别器(例如UITapGestureRecognizer),以便控制器了解用户交互。
  4. 您甚至可以混合搭配这些架构模式。

    但是你应该真正看起来进入iOS编程基础,以便更好地理解这一点。

    此外,我在您的代码中看到的第一个错误是您创建一个通用的UIViewController,当您应该真正创建它的自定义子类时,在Storyboard中定义并且单独的子类UIViewController

    我看到的第二个错误是您的UIView响应做tableView:didSelectRowAtIndexPath:方法,实际上永远不会。所有这些代码必须移回一个UIViewController子类。

答案 1 :(得分:3)

PresentViewControllerUIViewController类不是UIView的方法,您可以做一件事,创建UIViewController实例并将其视图设置为您拥有的视图然后呈现它。 像下面的东西

YourCustomView *customView = [[YourCustomView alloc]initWithFrame:someFrame];

UIViewController *viewController = [UIViewController new];
viewController.view = customView;

//From currentViewController present this 
[self presentViewController:viewController animated:YES completion:nil] ;

根据您的要求自定义此代码

但是当你在视图中时需要将此事件传递给viewController,因此更好地实现委托方法,并在您调用当前viewController调用委托的地方,该委托在ViewController中实现,并且在presentViewController中将customView设置为其view属性

答案 2 :(得分:2)

您还可以从导航控制器对象

显示您的viewcontroller

在App Delegate或任何地方创建全局导航对象,您可以从视图中访问navigationcontroller对象

@property (strong, nonatomic) UINavigationController *gblNavigation;

//从NavigationController对象

呈现viewcontroller
[gblNavigation presentViewController:YOUR_VC_Object animated:YES completion:nil];

答案 3 :(得分:2)

您可以使用以下代码在没有任何视图层次结构问题的情况下执行此操作。

<强>的ObjectiveC

UIViewController *currentTopVC = [self currentTopViewController];
currentTopVC.presentViewController......... 

- (UIViewController *)currentTopViewController
{
    UIViewController *topVC = [[[[UIApplication sharedApplication] delegate] window] rootViewController];
    while (topVC.presentedViewController)
    {
        topVC = topVC.presentedViewController;
    }
    return topVC;
}

<强>夫特

var topVC = UIApplication.sharedApplication().keyWindow?.rootViewController
while((topVC!.presentedViewController) != nil){
     topVC = topVC!.presentedViewController
}
topVC?.presentViewController........

答案 4 :(得分:1)

您无法从视图中呈现视图控制器。您只能从视图控制器中显示视图控制器。

Apple希望观点愚蠢。那就是视图应该只知道如何显示内容。视图不应响应用户交互:应该传递给视图控制器。

您可能需要考虑使用委托模式,目标操作或类似的东西来允许视图控制器控制交互。