ios - 在不使用 Segue 的情况下在 ViewController 之间传递数据

标签 ios objective-c uiviewcontroller storyboard

我知道这个问题重复了,但要求略有不同,所以在这里发帖。我知道如何通过定义属性来保存从第一个 ViewController 传递的值,从而将值从一个 ViewController 传递到另一个。我附上了 ScreenShot 以便更好地理解。 enter image description here我所做的是将 UIPageViewController 嵌入到 NavigationController(SwipeBetweenViewController) 中。从 UIPageViewController 以编程方式调用 UIViewController(ProfileViewController)。单击 LOG IN 按钮后,得到一些响应,并将其存储在变量中。现在我要做的是将该变量传递给 ProfileViewController。我在 ProfileViewController.h 中定义了一个 propertyimported ProfileViewController.h 到 LoginViewController .m.我在 LoginViewControllerProfileViewController 之间直接传递数据,它应该从 UiPageViewController 传递。这是代码,我已经尝试过但它不起作用。执行控制保留在同一页面上,没有导航。

ProfileViewController.h

 @interface KKProfileViewController : UIViewController
 @property(copy, nonatomic) NSString *userEmailId;
 @end

LoginViewController.m

-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
    if (error) {
        // Handle error
    }
    else {
        NSError *tempError;

        NSDictionary* response=(NSDictionary*)[NSJSONSerialization JSONObjectWithData:receivedData options:kNilOptions error:&tempError];
        NSString *loginResponse =response[@"message"];
        _emailId =response[@"email"];

        if ([loginResponse isEqualToString:@"Welcome"])

        {
            [self passLoginDataForward];
            [self performSegueWithIdentifier:@"loginSuccess" sender:self];

        }
        else
        {
            //code for error alert

        }

        NSLog(@"Response is :%@", response);

    }

}


-(void)passLoginDataForward
{

    ProfileViewController *viewControllerProfile =[self.storyboard instantiateViewControllerWithIdentifier:@"profileViewController"];

    viewControllerProfile.userEmailId = _emailId;
    NSLog(@"user Email %@", viewControllerProfile.userEmailId);
    [self.navigationController pushViewController:viewControllerProfile animated:YES];
}

SwipeViewController.m

- (void)viewDidLoad
{
[super viewDidLoad];
[[UINavigationBar appearance] setBarTintColor:[UIColor whiteColor]];
self.navigationBar.translucent = YES;
firstVC = [self.storyboard instantiateViewControllerWithIdentifier:@"profileViewController"];
secondVC = [self.storyboard instantiateViewControllerWithIdentifier:@"dashboardViewController"];
thirdVC = [self.storyboard instantiateViewControllerWithIdentifier:@"newsViewController"];
viewControllerArray = [[NSMutableArray alloc]init];
viewControllerArray = @[firstVC,secondVC,thirdVC];
self.currentPageIndex = 0;
self.isPageScrollingFlag = NO;
self.hasAppearedFlag = NO;
}
-(void)setupPageViewController 
{
pageController = (UIPageViewController*)self.topViewController;
pageController.delegate = self;
pageController.dataSource = self;
[pageController setViewControllers:@[[viewControllerArray objectAtIndex:0]]    direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:nil];
 [self syncScrollView];
  }

最佳答案

问题是因为您的登录 View Controller 可能没有导航 Controller ,而您正在尝试推送 View Controller 。在这种情况下什么也不会发生。

如果您想将页面 View Controller 推送到登录 View 导航堆栈,请将您的登录 View Controller 嵌入导航 Controller (选择登录 View Controller Editor>Ember>导航 Controller )并添加一个segue到 pageviewcontroller(直接从登录 View Controller ,而不是从任何按钮)。为 segue 添加标识符(比如 yourSegueID) 然后实现以下方法

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"yourSegueID"]) {
        UIPageViewController *pageViewController = [segue destinationViewController];
        ProfileViewController *viewControllerProfile =[self.storyboard instantiateViewControllerWithIdentifier:@"profileViewController"];

        viewControllerProfile.userEmailId = _emailId;

        [pageViewController setViewControllers:@[viewControllerProfile] direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
    }
}

然后调用

[self performSegueWithIdentifier:@"yourSegueID" sender:nil];

第二个选项

如果你想创建新的导航堆栈,就像在你当前的 Storyboard实现中一样,使从登录 View Controller 到导航 Controller 的转场成为当前模式转场,然后更改 prepareForSegue

中的以下行
    UIPageViewController *pageViewController = [segue destinationViewController];

UINavigationController *navController = [segue destinationViewController];
UIPageViewController *pageViewController = navController.viewControllers[0];

更新

根据您的新代码更新 swipeviewcontroller 在这种情况下,您还必须在滑动 View Controller 中添加电子邮件属性。然后将其设置为 prepare for segue 方法。然后在滑动 View Controller viewdidload中设置profile view controllers属性

关于ios - 在不使用 Segue 的情况下在 ViewController 之间传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34281943/

相关文章:

ios - 如何显示 View Controller 对于来电,即使设备也被锁定并且应用程序处于后台状态?

iOS:在当前模态视图 Controller 后面切换 View Controller ?

objective-c - UIScrollView 添加 UIViewController 作为 subview ?与 UIPageControl

ios - 如何通过按钮更新分配给自定义单元格中索引路径的核心数据

ios - 使用 XCTest 测试 iOS 应用程序时检查 XCUIElement 在屏幕上的位置

ios - 从 navigationItem 中删除项目以编程方式显示 navigationItems 标题

ios 11透明导航栏

objective-c - 当某些 UIImageViews 被隐藏时,重新定位 View 上的 UIImageViews

iphone - Objective-C:向 map 添加注释时 EXC_BAD_ACCESS

swift - 在 Swift 中使用 Container 查看另一个 ViewController 时通过协议(protocol)传递数据