从segue

时间:2016-07-03 04:35:13

标签: ios objective-c uiviewcontroller segue updating

iOS Objective-C问题:我无法让我的View Controller显示我从另一个View Controller传入的值。我怎样才能解决这个问题?

这是交易 -

每当我尝试在ViewDidLoad方法中更改它们时,我有4个UILabel属性(planetTitle,planetSubtitle,distanceFromEarth和distanceFromSun)。示例:我试过

planetTitle.text = @"Test"

它工作正常。但是,当我尝试在我用来接收数据的方法(称为cellWasPressed)中更改这些属性的文本值时,它不起作用。我已经使用断点测试了我的cellWasPressed方法,并且所有数据都很好 - 我只是无法更改属性值。这可能是我错过的非常基本的东西,但请让我知道我哪里出错了。我的ViewController.m文件在下面(亲切的哈哈)。 (那里的updateViews方法只是为了尝试另一种方法,也没有用)。

- (void)viewDidLoad {
   [super viewDidLoad];
}

- (void)didReceiveMemoryWarning {
   [super didReceiveMemoryWarning];
}

-(void) cellWasPressed:(Planet *) planet{

   NSString *planetName = planet.planetName;
   NSString *distanceFromSun = [NSString stringWithFormat:@"%.2f Million Miles",planet.distanceFromSun];
   NSString *distanceFromEarth = [NSString stringWithFormat:@"%.2f Million Miles",planet.distanceFromEarth];
   NSString *planetSubtitle = planet.planetDescription;
   [self updateViews:planetName sun:distanceFromSun earth:distanceFromEarth subtitle:planetSubtitle];
}


-(void) updateViews:(NSString *) title sun: (NSString *) sun earth: (NSString *) earth subtitle: (NSString *) subtitle{
   _planetTitle.text = title;
   _planetSubtitle.text = subtitle;
   _distanceFromSun.text = sun;
}

Segue :(我还将Planet属性添加到目标的.h文件中)

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

    PlanetInformationViewController *planetInformationViewController = segue.destinationViewController;

    UITableViewCell *selectedCell = (UITableViewCell *) sender;

    if([selectedCell.textLabel.text isEqualToString:@"Mars"]){
        planetInformationViewController.Planet = _planetList[0];
        [planetInformationViewController cellWasPressed:_planetList[0]];
    }
    else if ([selectedCell.textLabel.text isEqualToString:@"Earth"]){
        planetInformationViewController.Planet = _planetList[1];
        [planetInformationViewController cellWasPressed:_planetList[1]];
    }
    else if ([selectedCell.textLabel.text isEqualToString:@"Jupiter"]){
        planetInformationViewController.Planet = _planetList[2];
        [planetInformationViewController cellWasPressed:_planetList[2]];
    }

}

2 个答案:

答案 0 :(得分:1)

当你在prepareForSegue中调用一个影响网点的方法时,它不起作用,因为此时网点尚未连接。

  • 在目标视图控制器中创建属性

    @property Planet *planet;
    
  • prepareForSegue

    中将行星实例分配给此属性
    planetInformationViewController.planet = _planetList[x];
    

    顺便说一下:找到行星与_planetList之间的基于索引的关系,以避免重复代码,并且不从单元格(视图)获取行星的名称。从数据源数组(模型)中获取它。

  • [self cellWasPressed]中调用viewWillAppear并删除方法中的参数。

    -(void) cellWasPressed {...
    

答案 1 :(得分:-1)

在准备segue的最后,添加这种代码。

<强>夫特

var _ = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: Selector("loadData"), userInfo: nil, repeats: false)

func loadData()
{
    //Call your cell pressed function here.
}

这会给通话增加一点延迟。

在类似的情况下,它对我有用。

  

更新

objective-c

[NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(loadData) userInfo:nil repeats:YES];

- (void)loadData:(NSTimer*)timer { 
    //Call your cell pressed function here.
}