将数据传递给视图控制器

Posted

技术标签:

【中文标题】将数据传递给视图控制器【英文标题】:passing data to a view controller 【发布时间】:2016-02-24 14:08:14 【问题描述】:

这是我传递数据的按钮功能。

问题是地区和国家详细信息被传递到下一个 ViewController 但纬度和经度返回 null。

在 ViewController.m 中:

- (IBAction)forecast:(UIButton *)sender

    ForecastViewController *sendDetails = [[ForecastViewController alloc] init];
    NSArray *seperate = [full componentsSeparatedByString:@", "];
    Area = seperate[0];
    Country = seperate[1];
    sendDetails.Area = Area;
    sendDetails.Country = Country;
    NSLog(@"%@%@",self.longitude,self.latitude);
    NSString *lt = self.latitude;
    NSString *ln = self.longitude;
    sendDetails.longitude = lt;
    sendDetails.latitude = ln;

在 ForecastViewController.h 中

//
//  ForecastViewController.h
//  Weather App
//
//  Created by Mac-Mini-2 on 10/02/16.
//  Copyright © 2016 Mac-Mini-2. All rights reserved.
//

#import <UIKit/UIKit.h>
#import <CoreData/CoreData.h>
#import <Reachability.h>

@interface ForecastViewController : UIViewController <UITableViewDataSource,UITableViewDelegate>

@property (weak, nonatomic) IBOutlet UILabel *place;
@property (weak, nonatomic) IBOutlet UITableView *table;
@property (weak, nonatomic) IBOutlet UIActivityIndicatorView *activityIndicator;

@property NSString *Area;
@property NSString *Country;
@property NSString *latitude;
@property NSString *longitude;

@end

在 ForecastViewController.m 中

- (void)viewDidLoad

    [super viewDidLoad];
    // Do any additional setup after loading the view.
    self.table.delegate = self;
    self.table.dataSource = self;
    self.place.text = [NSString stringWithFormat:@"%@, %@",self.Area,self.Country];
    locationName = [NSString stringWithFormat:@"%@, %@",self.Area,self.Country];

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    metric = [defaults boolForKey:@"metric"];
    Reachability *reach = [Reachability reachabilityWithHostName:@"www.google.com"];
    NSInteger x = [reach currentReachabilityStatus];
    if (x > 0)
    
        reachable = YES;
        NSLog(@"%@, %@",self.latitude,self.longitude);
        [self getForecast:self.latitude longitudes:self.longitude];

    
    else
    
        reachable = NO;
        [self getData];
        errorMsg = @"Because of unavailability of Network Realtime information wont be available.";
        [self performSelectorOnMainThread:@selector(displayAlert) withObject:NULL waitUntilDone:YES];
    
    [reach startNotifier];

请让我知道我可能在哪里出错了。 我通过将数据记录到控制台来检查。打印区域和国家,但经度和纬度给出空值。

【问题讨论】:

您没有向我们展示您在何处/如何设置经度和纬度。 我正在打印它们以查看它们是否包含数据......并确保我没有传递 nil 值......它们不是......我也检查了这些值......正如我所说地区和国家通过,但其他两个不...我很困惑 我已经编辑了我的问题,你可以看到我现在将它们发送到哪里 你在哪里设置经纬度 您的代码中显然缺少一些东西...在forecast: 方法中,您分配了一个ForecastViewController,设置了它的一些属性,然后不对其进行任何操作(所以它被丢弃了)。您在哪里/如何展示新的视图控制器?您不会在情节提要中使用转场吗? 【参考方案1】:

如果您要推送到 ForecastViewController,也许实现 prepareForSegue:sender: 是您的最佳选择。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender


    if ([[segue identifier] isEqualToString:@"viewForecast"])

    NSArray *seperate = [full componentsSeparatedByString:@", "];
    Area = seperate[0];
    Country = seperate[1];        
        [(ForecastViewController *) [segue destinationViewController] setArea:area];
[(ForecastViewController *) [segue destinationViewController] setCountry:country];
...
...
    

【讨论】:

知道只有区域和国家/地区有效,而其他两个无效吗? 那些不见了,[(ForecastViewController *) [segue destinationViewController] setLongitude:lt]; [(ForecastViewController *) [segue destinationViewController] setLatitude:ln]; 您还必须在情节提要上添加转场 现在我只使用 segues 执行操作,除了 IBAction 按钮之外我没有使用其他任何东西。它确实会转到下一个视图并打印除纬度和经度之外的详细信息。 可能将您的属性更改为 @property (nonatomic, strong) NSString *latitude;【参考方案2】:

我可以将纬度和经度作为数字存储在第一个控制器中吗?你确定 'ViewController' 中的 'sendDetails.latitude' 和 'longitude' 设置正确吗?

【讨论】:

我已将 lat 和 long 转换为字符串,然后将它们传递给它们,即使这似乎不起作用。是的.. 否则 NSLog 不会给我它在我的 ViewController.h 中打印所有详细信息区域国家纬度和经度的结果,但是在 ForecastViewController 中它只打印区域和国家【参考方案3】:

我认为您需要先在 ForecastViewController.h 集中编辑两点

@property (Strong, nonatomic) NSString *Area;
@property (Strong, nonatomic) NSString *Country;
@property (Strong, nonatomic) NSString *latitude;
@property (Strong, nonatomic) NSString *longitude;

并在 ForecastViewController.m 中 @synthsize 它。 其次:-

  - (IBAction)forecast:(UIButton *)sender
    


     ForecastViewController *sendDetails = [self.storyboard instantiateViewControllerWithIdentifier:@"your ForecastViewController name in storyboard"];
    NSArray *seperate = [full componentsSeparatedByString:@", "];
    Area = seperate[0];
    Country = seperate[1];
    sendDetails.Area = Area;
    sendDetails.Country = Country;
    NSLog(@"%@%@",self.longitude,self.latitude);
    NSString *lt = self.latitude;
    NSString *ln = self.longitude;
    sendDetails.longitude = lt;
    sendDetails.latitude = ln;
    [self.navigationController pushViewController:sendDetails animated:YES];

【讨论】:

以上是关于将数据传递给视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

如何在将数据推送到导航堆栈之前将数据传递给视图控制器并加载它?

如何将数据传递给嵌套控制器(UIContainerView)?

CodeIgniter 将数据传递给视图

将数据传递给 viewController

如何通过数组将数据传递给表格视图?

单击注释时,如何将数据传递给其视图控制器?