我是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,所以我觉得有点难以理解这个
答案 0 :(得分:1)
UITableViewCell *cell = sender;
基本上通过变量将sender
投射到UITableViewCell
的实例。这样使用,以便您稍后可以访问cell.textLabel
和cell.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...
的一部分。