从原型单元转移NSString不使用prepareForSegue

时间:2013-01-13 18:13:04

标签: ios objective-c xcode

我只是想将一个简单的字符串从原型单元格中的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;
    }
}

我在这里做错了什么?

3 个答案:

答案 0 :(得分: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];
    }
}

实际上,您应该在viewController one的方法(viewDidLoadviewWillAppear)中为文本标签指定文本。因此,您需要在viewController中创建一个用于传输NSString

的属性

答案 1 :(得分: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.text之后的presentModalViewController。现在发生了什么?

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

我知道您已经在使用Segue。你应该按照另一个答案。

答案 2 :(得分: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];
    }
}

如果您的segue是从单元格到下一个场景,您也可以使用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的{​​{1}}属性。尚未创建label的控件。您应该将设置控件推迟到destinationController的{​​{1}}。因此,在目标控制器中创建一个destinationController属性:

    viewDidLoad

    显然,您应该使用比NSString更具描述性的名称,但希望您明白这一点。无论如何,@property (nonatomic, strong) NSString *textProperty; 可以设置此新属性,然后目标控制器的textProperty应该使用该prepareForSegue属性来填充viewDidLoad的{​​{1}}属性,例如:

    NSString