gpt4 book ai didi

iOS - segue 和 tableView

转载 作者:行者123 更新时间:2023-11-29 03:22:24 26 4
gpt4 key购买 nike

我是 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[segue.identifier isEqualToString:@"PushAppDetails"],然后我创建了AppdetailsViewController类的对象,但是我不明白这条线在做什么

 UITableViewCell *cell = sender; 

以及这一行如何调用开关函数所在的底部表函数以及每个单元格的描述而不是这一行

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出身的所以感觉有点难理解

最佳答案

UITableViewCell *cell = sender; 基本上是通过变量将 sender 转换为 UITableViewCell 的实例。这用于稍后访问 cell.textLabelcell.detailTextLabel。由于 senderid 类型,因此您不能编写 sender.textLabel。但如果你愿意,你可以就地转换:

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

如果您更喜欢它,请随时使用它。我个人更喜欢分配给特定类(class),因为它更明显。

并且此行不调用 tableView:cellForRowAtIndexPath:,它采用已在 UITableViewCell 上设置的 NSString。调用 prepareForSegue:sender: 的 Apple 代码会将触摸的单元格作为参数 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:,您最终会得到两个 UILabel。
由于您不知道所调用的大多数 init 方法的实现细节,因此在 Objective-C 中,您永远不应多次调用 init。

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

关于iOS - segue 和 tableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20919559/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com