从 didSelectRowAtIndexPath iOS 10 在 UIViewController 中添加新的 subView

Posted

技术标签:

【中文标题】从 didSelectRowAtIndexPath iOS 10 在 UIViewController 中添加新的 subView【英文标题】:Adding new subView in UIViewController from didSelectRowAtIndexPath iOS 10 【发布时间】:2016-10-05 09:57:37 【问题描述】:

我遇到了问题:

我的 iPad 主页分为两个视图。

1-st - 菜单(UITableView)(左侧);

2-nd - 我更改 UIView(右侧)的工作区(UIViewController)。

应用运行正常,看起来就像一个普通的社交网页。

AppDelegate.m

首先,我为工作区初始化 UIViewControllers 并将它们添加到数组中。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    [[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];

    NSMutableArray *vcs = [NSMutableArray array];

    FriendsForImport *friendsForImport = [[CoreDataHelper helperCoreDataHelper] getSocialAccountInfoByIdSocial:0 withUid:@"myUid"];

    SocialPageViewController *socialPageViewController = [[SocialPageViewController alloc] initWithIdSocial:0 withFriendsForImport:friendsForImport withMyAccount:1];

    UINavigationController *socialPageNavigationController = [[UINavigationController alloc] initWithRootViewController:socialPageViewController];

    NSDictionary *socialPageNavigationControllerDict0 = [NSDictionary dictionaryWithObjectsAndKeys:socialPageNavigationController, @"vc", [NSString stringWithFormat:NSLocalizedString(@"MainMenuMyPageViewController", nil)], @"title", @"111-user.png", @"image", @"1", @"notification", @"0", @"idSocial",nil];

    [vcs addObject:socialPageNavigationControllerDict0];

        .....init and add to array another......

    Below In this method I init main UIViewController (**iPadSHSidebarViewController**) with UIViewControllers array.

    _sidebariPad = [[iPadSHSidebarViewController alloc] initWithArrayOfVC:vcs];
            self.window.rootViewController = _sidebariPad;

在主 UIViewController iPadSHsidebarViewController.m

- (void)viewDidLoad

     //init work area
     _mainViewController = [[UIViewController alloc] init];

     //init menu
     _menuView=[[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width*ksliderMenuWidthKoeff, self.view.frame.size.height)];
     [self.view addSubview:_menuView];
        .....
     //set to work area first UIViewController from array (SocialPageViewController)
     [self changeMain:[[viewsArray objectAtIndex:0] objectForKey:@"vc"]];


// for changing UIViewControllers in work area
-(void)changeMain:(UIViewController *)main

     [_mainViewController.view removeFromSuperview];
     _mainViewController = main;
     _mainViewController.view.frame=CGRectMake(_menuView.frame.size.width, 0, self.view.frame.size.width-_menuView.frame.size.width, self.view.frame.size.height);
     [self.view addSubview:_mainViewController.view];   


// for opening selected user's page UIViewControllers in work area above all opened UIViewControllers

-(void)setModalInMain:(UIViewController *)modal

     modal.view.tag=countTag++; 
     [_mainViewController.view addSubview:modal.view];

SocialPageViewController 是用户的页面,它首先是我们在应用初始化时在工作区看到的。

SocialPageViewController 得到了一个带有好友列表的 UIViewTable。 当用户点击好友列表中的行时,使用工作区的 UIViewControler (iPadSHsidebarViewController) 方法 setModalInMain 使用所选用户的数据初始化新的 UIViewControler。

SocialPageViewController.m

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

    FriendsForImport *friendsForImport = [_listArrayForOut objectAtIndex:indexPath.row];

    if([friendsForImport.active intValue]==1)

        SocialPageViewController *socialPageViewController = [[SocialPageViewController alloc] initWithIdSocial:_idSocial withFriendsForImport:friendsForImport withMyAccount:0];
        socialPageViewController.delegate=self;
        UINavigationController *socialPageNavigationController = [[UINavigationController alloc] initWithRootViewController:socialPageViewController];

        iPadSHSidebarViewController *ipadSHSidebarViewController=(iPadSHSidebarViewController*)XAppDelegate.window.rootViewController;
        [ipadSHSidebarViewController setModalInMain: socialPageNavigationController];
    

在 iPhone (iOS8,10) 中一切正常。

在 iPad (iOS8) 中一切正常

截图 #1

但在 iOS 10 中 - 当我点击该行时,而不是用户的数据页面,会打开带有白色导航栏的空 UIViewController

(但如果在 ios 10 中我尝试在其他地方执行此操作(点击导航栏按钮)- 一切正常)。

截图#2

如果我尝试在没有导航栏的情况下从 didSelectRowAtIndexPath 打开页面 - 一切正常。但是页面打开时没有导航栏。

截图#3

为什么在 iOS10 和 didSelectRowAtIndexPath 方法中会发生这种情况?

【问题讨论】:

【参考方案1】:

这次我通过在addSubView之前添加延迟来找到解决方案

    double delayInSeconds = 0.1;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void)
        [ipadSHSidebarViewController setModalInMain: socialPageNavigationController];
    );

【讨论】:

以上是关于从 didSelectRowAtIndexPath iOS 10 在 UIViewController 中添加新的 subView的主要内容,如果未能解决你的问题,请参考以下文章

TableView:如何从 didSelectRowAtIndexPath 例程中选择另一行的值

从 didSelectRowAtIndexPath 发送到实例的无法识别的选择器

需要从自定义单元格中的 UITextField 中触发 didSelectRowAtIndexPath

如何从情节提要中的 didSelectRowAtIndexPath 打开视图控制器?

Swift 4.2 - 如何从 tableView 中的“didSelectRowAtIndexPath”方法调用“indexPath.row”到另一个类?

如何从调用方法didSelectRowAtIndexPath将数据传递给ios应用程序中的子视图控制器