iOS 如何从 Uiview 呈现 Modal ViewController

Posted

技术标签:

【中文标题】iOS 如何从 Uiview 呈现 Modal ViewController【英文标题】:iOS how present Modal ViewController from Uiview 【发布时间】:2014-10-14 16:52:55 【问题描述】:

我有一个 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;

    

【问题讨论】:

请分享一段代码... 问题是我不知道从 uiview 子类显示视图控制器。 这不是一个新问题。看看这个链接。 ***.com/questions/15779485/… 【参考方案1】:

当您需要在UIView 实例和UIViewController 之间进行通信时,您应该遵守一些已知的 ios 概念。正如您所发现的那样,UIView 不能真正呈现新的控制器(缺少presetViewController:animated:completion 方法或navigationController 属性,它们都存在于UIViewController 中)。

视图应该是代码中最可重用的部分,因此您必须想办法将视图设计为完全看不到它们所在的位置。他们通常只知道用户交互。

首先,你必须做的是重构你的视图。

    如果您的 UIView 应该是 UIControl(具有某种目标选择器),您需要在控制器中使用 add target 从视图交互中获取回调。 您可以使用在UITableViewUICollectionView 中使用的委托模式,它被设计为一种协议。 您可以使用添加到视图中的手势识别器(例如UITapGestureRecognizer),以便控制器了解用户交互。

您甚至可以混合和匹配这些架构模式。

但您应该真正了解 iOS 编程基础知识,以便更好地理解这一点。

此外,我在您的代码中看到的第一个错误是您创建了一个通用的UIViewController,而您实际上应该创建它的自定义子类,在 Storyboard 中定义和@987654333 的单独子类@。

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

【讨论】:

【参考方案2】:

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 中实现,并且在将 customView 设置为其视图属性的 presentViewController 中

【讨论】:

好吧,你的代码我已经做对了,现在如果你在上面看到我的代码,我想在表单中展示。谢谢【参考方案3】:

您可以使用以下代码执行此操作,而不会出现任何视图层次结构问题。

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】:

您还可以从导航控制器对象展示您的视图控制器

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

@property (strong, nonatomic) UINavigationController *gblNavigation;

//从 NavigationController 对象呈现视图控制器

[gblNavigation presentViewController:YOUR_VC_Object animated:YES completion:nil];

【讨论】:

【参考方案5】:

您不能从视图中呈现视图控制器。您只能从视图控制器呈现视图控制器。

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

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

【讨论】:

以上是关于iOS 如何从 Uiview 呈现 Modal ViewController的主要内容,如果未能解决你的问题,请参考以下文章

在 Modal 之后推送 UIView

如何将道具从 FlatList 项目传递给 Modal?

iOS开发中控制器切换方式Modal

如何从 UITableViewCell 呈现 UIView

呈现 UIView 的最少代码

从 Popover View 内部呈现 Modal View Controller