iOS - segue和tableView

时间:2014-01-04 10:09:11

标签: ios objective-c uitableview segue

我是iOS编程新手。我正在阅读一本书和一些教程来学习它。我需要一些帮助来理解这些方法

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"PushAppDetails"])
    {
        AppDetailsViewController *appDetailsViewController = segue.destinationViewController;
        UITableViewCell *cell = sender;
        appDetailsViewController.appDetails =
        [[AppDetails alloc] initWithName:cell.textLabel.text
                             description:cell.detailTextLabel.text];
    }
}



{
    //Set the CellIdentifier that you set in the storyboard
    static NSString *CellIdentifier = @"AppCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    switch (indexPath.row)
    {
        case 0:
            cell.textLabel.text = @"Awesome App";
            cell.detailTextLabel.text = @"Long description of the awesome app...";
            break;
        case 1:
            cell.textLabel.text = @"Even More Awesome App";
            cell.detailTextLabel.text = @"Long description of the even more awesome app...";
            break;
        case 2:
            cell.textLabel.text = @"The Most Awesome App Ever";
            cell.detailTextLabel.text =
            @"Long description of the most awesome app ever seen...";
            break;

        default:
            cell.textLabel.text = @"Unkown";
            cell.detailTextLabel.text = @"Unknown";
            break;
    }

    return cell;
}

我不理解的是这些行

 UITableViewCell *cell = sender;
            appDetailsViewController.appDetails =
            [[AppDetails alloc] initWithName:cell.textLabel.text
                                 description:cell.detailTextLabel.text];

我得到了这个我从这行[segue.identifier isEqualToString:@"PushAppDetails"]识别segue然后我创建了 AppdetailsViewController 类的对象,但是我没有得到这行正在做什么

 UITableViewCell *cell = sender; 

以及该行如何调用底部表函数,其中switch函数是每个单元格的描述,而不是这一行

appDetailsViewController.appDetails =
        [[AppDetails alloc] initWithName:cell.textLabel.text
                             description:cell.detailTextLabel.text];

我的appDetails类中有一个方法..为什么不简单地我可以这样做,如果我必须访问该方法

 AppDetails *app = new [AppDetails alloc]init
  [app initWithName:cell.textLabel.text
                             description:cell.detailTextLabel.text];

我实际上来自java,所以我觉得有点难以理解这个

1 个答案:

答案 0 :(得分:1)

UITableViewCell *cell = sender;基本上通过变量将sender投射到UITableViewCell的实例。这样使用,以便您稍后可以访问cell.textLabelcell.detailTextLabel。由于sender的类型为id,因此您无法编写sender.textLabel。但如果你愿意,你可以投入到位:

appDetailsViewController.appDetails =
    [[AppDetails alloc] initWithName:((UITableViewCell *)sender).textLabel.text
                         description:((UITableViewCell *)sender).detailTextLabel.text];

如果您愿意,可以随意使用它。我个人更喜欢分配到特定的课程,因为它更明显。

并且此行不调用tableView:cellForRowAtIndexPath:,它采用已在UITableViewCell上设置的NSStrings。调用prepareForSegue:sender:的Apples代码会将触摸的单元格作为参数sender传递。


AppDetails *app = new [AppDetails alloc]init
[app initWithName:cell.textLabel.text description:cell.detailTextLabel.text];

首先,这是无效的Objective-C。如果您在Objective-C中编写代码,则不应期望您可以使用Java语法。

在Objective-c中你不应该多次调用init,这取决于init的实现,这会产生许多奇怪的效果。

例如,请使用以下代码:

- (id)init {
    if (self = [super init]) {
        self.label = [[UILabel alloc] init];
        [self.view addSubview:self.label];
    }
    return self;
}

- (id)initWithName:(NSString *)name {
    if (self = [self init]) {   // calls init
        self.label.text = name;
    }
    return self;
}

如果您致电init,则会添加新的UILabel,如果您稍后致电initWithName:,则会添加另一个UILabel,因为initWithName:会自行调用init
因此,如果您先拨打init,然后initWithName:再拨打两张UIL用户 由于您不知道您调用的大多数init方法的实现细节,因此不应该在Objective-C中多次调用init。

init...应该始终是[[Object alloc] init...的一部分。