从 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”到另一个类?