0

我只是想将一个简单的字符串从原型单元中的 UILabel 传输到下一个视图控制器中的标签中。View Controller 的 viewDidLoad 中 label.text 的值正在返回(null)。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    mainCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (mainCell == nil) {
        mainCell = [[dictionaryTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    NSString* date = [dateArray objectAtIndex:indexPath.row];
    mainCell.viewLabel.text = date;

    return mainCell;
}


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

    if ([segue.identifier isEqualToString:@"View Segue"]) {
        NSLog(@"View Load Segue Success");

        ViewController *one = segue.destinationViewController;
        one.label.text = mainCell.viewLabel.text;
    }
}

我在这里做错了什么?

4

3 回答 3

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

    if ([segue.identifier isEqualToString:@"View Segue"]) {
        NSLog(@"View Load Segue Success");
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        ViewController *one = segue.destinationViewController;
        one.label.text = [dateArray objectAtIndex:indexPath.row];
    }
}

one实际上,您应该在 viewController的方法(viewDidLoad或)中将文本分配给文本标签viewWillAppear。因此,您需要在 viewController 中创建一个属性来传输NSString.

于 2013-01-13T18:38:15.653 回答
1
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath     {
    YourViewController *controller =[[YourViewController alloc] init];
    [self presentModalViewController:controller animated:YES];
    one.label.text = [dateArray objectAtIndex:indexPath.row];
}

更改label.textpresentModalViewController。现在会发生什么?

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion 

我了解您已经在使用Segue. 您应该遵循其他答案。

于 2013-01-13T18:19:48.817 回答
1

您可以使用indexPathForSelectedRow

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

    if ([segue.identifier isEqualToString:@"View Segue"]) {

        ViewController *one = segue.destinationViewController;

        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];

        one.textProperty = [dateArray objectAtIndex:indexPath.row];
    }
}

sender或者,如果您的转场是从单元格到下一个场景,您也可以使用,例如:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"View Segue"])
    {
        ViewController *one = segue.destinationViewController;

        NSAssert([sender isKindOfClass:[UITableViewCell class]], @"Not cell");

        UITableViewCell *cell = sender;
        NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];

        one.textProperty = [dateArray objectAtIndex:indexPath.row];
    }
}

有两点需要注意:

  1. 作为一种良好的编程风格,我没有从单元格中检索文本值。我正在从模型中检索文本值。您不应该依赖视图来传递信息。回到模型,信息的原始来源。

  2. 不要直接在目标控制器中设置text属性。label的控件destinationController尚未创建。您应该将设置控件推迟到destinationController. viewDidLoad因此,改为NSString在目标控制器中创建一个属性:

    @property (nonatomic, strong) NSString *textProperty;
    

    显然,您应该使用比 更具描述性的名称textProperty,但希望您能理解。无论如何,prepareForSegue可以设置这个新属性,viewDidLoad然后目标控制器的 应该使用该NSString属性来填充 的text属性UILabel,例如:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        self.label.text = self.textProperty;
    }
    
于 2013-01-13T18:54:16.667 回答