gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 01:23:42 25 4
gpt4 key购买 nike

我知道这个问题重复了,但要求略有不同,所以在这里发帖。我知道如何通过定义属性来保存从第一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com